Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ค้นหาองค์ประกอบสุดท้ายหลังจากลบทุกองค์ประกอบที่สองในอาร์เรย์ของจำนวนเต็ม n ใน C++


พิจารณาว่าเรามีอาร์เรย์วงกลมหนึ่งชุดที่มีจำนวนเต็มตั้งแต่ 1 ถึง n ค้นหาองค์ประกอบสุดท้าย ซึ่งจะยังคงอยู่ในรายการหลังจากลบทุกองค์ประกอบที่สองโดยเริ่มจากองค์ประกอบแรก หากอินพุตเป็น 5 อาร์เรย์จะเป็น [1, 2, 3, 4, 5] เริ่มจาก 1 หลังจากลบแต่ละองค์ประกอบที่สองจะเป็นเช่น -

1 0 3 4 5
1 0 3 0 5
0 0 3 0 5
0 0 3 0 0

ดังนั้นองค์ประกอบที่ยังคงอยู่ในรายการคือ 3

เราจะแก้ปัญหานี้โดยใช้การเรียกซ้ำ สมมุติว่า n เป็นคู่ ตัวเลข 2, 4, 6 จะถูกลบออก จากนั้นเราจะเริ่มต้นจาก 1 อีกครั้ง ดังนั้นตัวเลข n/2 จะถูกลบออก และเราเริ่มต้นราวกับว่ารูปแบบ 1 ในอาร์เรย์ของ n/2 ที่มีเฉพาะเลขคี่ 1, 3, 5, … n/2 เราก็เขียนสูตรได้ดังนี้ −

solve(n)=2*solve(n/2)-1[when n is even]
solve(n)=2*solve(n-1/2)+1[when n is odd]

เงื่อนไขพื้นฐานคือแก้(1) =1

ตัวอย่าง

#include<iostream>
using namespace std;
int deleteSecondElement(int n) {
   if (n == 1)
      return 1;
   if (n % 2 == 0)
      return 2 * deleteSecondElement(n / 2) - 1;
   else
      return 2 * deleteSecondElement(((n - 1) / 2)) + 1;
}
int main() {
   int n = 5;
   cout << "Remaining Element: " << deleteSecondElement(n) << endl;
   n = 10;
   cout << "Remaining Element: " << deleteSecondElement(n) << endl;
}

ผลลัพธ์

Remaining Element: 3
Remaining Element: 5