इस समस्या में, हमें एक पूर्णांक n दिया गया है। हमारा कार्य i = 0 से n तक के उन पूर्णांकों की संख्या गिनने के लिए एक प्रोग्राम बनाना है जहां योग XOR के बराबर हो यानी (n+i) = (n^i)।
उदाहरण से समझते हैं:
इनपुट: n = 4
आउटपुट: 4
व्याख्या:
i = 0 से n तक के सभी मानों पर विचार करते हुए,
i = 0, 4 + 0 = 4, 4^0 = 4
i = 1, 4 + 1 = 5, 4^1 = 5
i = 2, 4 + 2 = 6, 4^2 = 6
i = 3, 4 + 3 = 7, 4^3 = 7
i = 4, 4 + 4 = 8, 4^4 = 0
गिनती = 4
समाधान दृष्टिकोण:
एक सरल समाधान n और i के योग और n और i के XOR के मान ढूंढना है। दोनों मानों की तुलना करें और फिर उन मानों की गिनती करें जिनके लिए वे बराबर हैं।
एल्गोरिदम:
चरण 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 है, तो इसके लिए हमें दोनों संख्याओं के विपरीत सेट और अनसेट बिट्स की आवश्यकता होती है। और हमें ऐसे मानों की गिनती करने की आवश्यकता है। यहां इसका प्रोग्राम है:
उदाहरण (अनुकूलित संस्करण)
#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