Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C++ में दी गई रेंज [L, R] में सभी तत्वों का XOR


इस समस्या में, हमें दो पूर्णांक L और R दिए गए हैं जो एक रेंज को दर्शाते हैं। हमारा कार्य रेंज [L, R] के भीतर सभी तत्वों का XOR खोजना है।

आइए एक उदाहरण से समस्या को समझते हैं,

इनपुट - L=3, R=6

व्याख्या - 3^4^5^6 =

इस समस्या को हल करने के लिए, हम R का MSB ढूंढेंगे। उत्तर का MSB R से अधिक नहीं होगा। अब, हम 0 से MSB तक बिट्स की संख्या की समता ढूंढेंगे।

अब, i-th बिट के लिए समता गणना खोजने के लिए, हम देख सकते हैं कि i-th बिट की स्थिति हर 2^i संख्या पर बदल जाएगी। वही रेंज L से R में सेट सभी i-th बिट के लिए है। ऐसा करने पर, दो मामले सामने आते हैं -

केस 1 (i != 0) - L के i-th बिट की जांच करें। यदि यह सेट है, तो L और L+2^i के बीच की संख्याओं की समता गणना जांचें। और यदि L का i-th बिट सेट है, तो L विषम है, तो गणना विषम है अन्यथा यह सम है। अब, हम R पर जाएंगे, और R-2^i और R के बीच तत्वों की संख्या की समता निर्धारित करेंगे और वही विधि अपनाएंगे।

बाकी सभी पूर्णांकों पर विचार नहीं किया जाता क्योंकि वे i-th बिट सेट के साथ पूर्णांक की सम संख्या उत्पन्न करेंगे।

केस 2 (i = 0) - यहां, हमें निम्नलिखित मामले पर विचार करना होगा -

केस 2.1 - L और R दोनों विषम हैं, 0th-बिट सेट वाले पूर्णांकों की संख्या (R-L)/2+1 होगी।

केस 2.2 - अन्यथा, गणना (R-L+1)/2 के राउंड डाउन नंबर होगी।

उदाहरण

हमारे समाधान के कार्यान्वयन को दिखाने वाला प्रोग्राम,

#include <iostream>
using namespace std;

int findMSB(int x) {
    int ret = 0;
    while ((x >> (ret + 1)) != 0)
        ret++;
    return ret;
}

int XOREleInRange(int L, int R) {
    int max_bit = findMSB(R);
    int mul = 2;
    int ans = 0;
    for (int i = 1; i <= max_bit; i++) {
        if ((L / mul) * mul == (R / mul) * mul) {
            if (((L & (1 << i)) != 0) && (R - L + 1) % 2 == 1)
                ans += mul;
            mul *= 2;
            continue;
        }
        bool oddCount = 0;
        if (((L & (1 << i)) != 0) && L % 2 == 1)
            oddCount = (oddCount ^ 1);
        if (((R & (1 << i)) != 0) && R % 2 == 0)
            oddCount = (oddCount ^ 1);
        if (oddCount)
            ans += mul;
        mul *= 2;
    }
    int zero_bit_cnt = (R - L + 1) / 2;
    if (L % 2 == 1 && R % 2 == 1)
        zero_bit_cnt++;
    if (zero_bit_cnt % 2 == 1)
        ans++;
    return ans;
}

int main() {
    int L = 1, R = 4;
    cout << "The XOR of all element within the range (" << L << ", " << R << ") is: " << XOREleInRange(L, R);
    return 0;
}

आउटपुट

The XOR of all element within the range (1, 4) is: 4
  1. C++ में दिए गए नोड के सब-ट्री के सभी नोड्स का XOR C++ में दिए गए नोड के सब-ट्री के सभी नोड्स का XOR

    इस समस्या में, हमें एक n-ट्री दी गई है और कुछ क्वेरीज हैं जो ट्री के नोड्स हैं। हमारा कार्य दिए गए नोड द्वारा बने सब-ट्री के सभी नोड्स का XOR प्रिंट करना है। आइए एक उदाहरण से समस्या को समझते हैं, क्वेरीज - {1, 6, 5} आउटपुट - 0 0 5 व्याख्या - 1^6^3^2^4^7^5 6^2^4 5 इस समस्या को हल करने के लिए, हम

  1. - C++ में XOR ऑपरेशन द्वारा सरणी योग न्यूनतम करें

    समस्या विवरण एक सरणी दी गई है, एक मान X ढूंढें जिससे प्रत्येक तत्व के साथ XOR करने के बाद सरणी का योग न्यूनतम हो। उदाहरण: arr = {8, 5, 7, 6, 9} यदि X = 5, तो XOR के बाद: 13, 0, 2, 3, 12 → योग = 30 (न्यूनतम) एल्गोरिदम 32-बिट बिटमैप बनाएं प्रत्येक तत्व के सेट बिट्स गिनें n/2 हैं, तो X में वह बिट

  1. - Python - दी गई रेंज के लिए सूची में सभी सम तत्वों की जांच करना

    जब दी गई रेंज के लिए सूची में सभी सम तत्वों की जांच करना आवश्यक हो, तो एक साधारण पुनरावृत्ति और मॉड्यूलस ऑपरेटर का उपयोग किया जाता है। नीचे इसका प्रदर्शन दिया गया है: उदाहरण my_list = [32, 12, 42, 61, 58, 60, 19, 16] print(The list is :) print(my_list) i, j = 2, 7 my_result = True for index in ra