ในปัญหานี้ เราได้รับจำนวนเต็ม n งานของเราคือสร้างโปรแกรมเพื่อหาจำนวนเต็มตั้งแต่ i =0 ถึง n โดยที่ sum เท่ากับ XOR เช่น (n+i) =(n^i)
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน
ป้อนข้อมูล: n =4
ผลลัพธ์: 4
คำอธิบาย:
พิจารณาค่าทั้งหมดของ i ตั้งแต่ 0 ถึง n
ผม =0, 4 + 0 =4, 4^0 =4
ผม =1, 4 + 1 =5, 4^1 =5
ผม =2, 4 + 2 =6, 4^2 =6
ผม =3, 4 + 3 =7, 4^3 =7
ผม =4, 4 + 4 =8, 4^4 =0
นับ =4
แนวทางการแก้ปัญหา:
วิธีแก้ไขอย่างง่ายคือการหาค่าของผลรวมของ n และ i และ xor ของ n และ i เปรียบเทียบค่าทั้งสองนี้แล้วนับค่าที่เท่ากัน
อัลกอริทึม:
ขั้นตอนที่ 1: วนซ้ำสำหรับค่าทั้งหมดตั้งแต่ i =0 ถึง n
ขั้นตอนที่ 1.1: หาค่าของ (n + i)
ขั้นตอนที่ 1.2: หาค่าของ (n^i)
ขั้นตอนที่ 1.3: เปรียบเทียบค่าที่พบในขั้นตอนที่ 1.1 และ 1.2
ขั้นตอนที่ 1.4: หากเท่ากันให้เพิ่มจำนวน
ขั้นตอนที่ 2: พิมพ์ นับ ค่า
โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา
ตัวอย่าง
#include <iostream> using namespace std; int main() { int n = 5; int counter = 0; for(int i=0; i<=n; i++ ) if ( (n+i) == (n^i) ) counter++; cout<<"The count of integers with equal sum and XOR is "<<counter; return 0; }
ผลลัพธ์ -
The count of integers with equal sum and XOR is 2
วิธีนี้ดีแต่อาจเป็นวิธีแก้ปัญหาที่ดีกว่า ซึ่งก็คือการใช้ข้อเท็จจริงที่ว่า
ถ้า n^i =n+i จากนั้น n&i =0 .
หากค่าของ n&i =0 สำหรับสิ่งนั้น เราต้องการให้ตัวเลขทั้งสองมีค่าตรงข้ามกับ set และ unset bits และเราจำเป็นต้องนับค่าดังกล่าว นี่คือโปรแกรมที่จะทำ
ตัวอย่าง
#include <iostream> using namespace std; int countValuesWithEqualSumXOR(int n) { int countUnSetBits=0; while (n) { if ((n & 1) == 0) countUnSetBits++; n=n>>1; } return 1 << countUnSetBits; } int main() { int n = 6; cout<<"The count of integers with equal sum and XOR is "<<countValuesWithEqualSumXOR(n); return 0; }
ผลลัพธ์ -
The count of integers with equal sum and XOR is 2