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

ค้นหาจำนวนที่น้อยที่สุด n โดยที่ n XOR n+1 เท่ากับที่กำหนด k ใน C++


สมมติว่าเรามีจำนวนบวก k เราต้องหาจำนวนบวก n โดยที่ XOR ของ n และ n+1 จะเท่ากับ k ดังนั้นหาก k =7 (111) ผลลัพธ์จะเป็น 3 เช่น 3 (011) และ 3 + 1 =4 (100) ดังนั้น 011 XOR 100 =111 (7)

เป็นไปได้สองกรณี พิจารณาว่า n เป็นคู่ บิตสุดท้ายของ n =0 จากนั้นบิตสุดท้ายของ n + 1 =1 บิตที่เหลือจะเหมือนกัน ดังนั้น XOR จะเป็น 1 เมื่อ n เป็นเลขคี่ บิตสุดท้ายที่ 1 และบิตสุดท้ายของ n + 1 บิตเป็น 0 แต่ในกรณีนี้ บิตที่มากกว่าซึ่งแตกต่างกันเนื่องจากการพกพา แครี่ยังคงแพร่กระจายไปทางซ้ายจนกว่าเราจะได้ 0 บิตแรก ดังนั้น n XOR n + 1 จะเป็น 2^i -1 โดยที่ i คือตำแหน่งของ 0 บิตแรกใน n จากซ้าย ดังนั้นเราสามารถพูดได้ว่าถ้า k อยู่ในรูปแบบ 2^i – 1 คำตอบจะเป็น k/2

ตัวอย่าง

#include<iostream>
using namespace std;
int findNValue(int k) {
   if (k == 1)
      return 2;
   if (((k + 1) & k) == 0)
      return k / 2;
      return -1;
}
int main() {
   int k = 15;
   cout << "The value of n is: " << findNValue(k);
}

ผลลัพธ์

The value of n is: 7