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

दिए गए श्रेणी में सभी तत्वों का XOR [L, R] C++ . में


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

समस्या को समझने के लिए एक उदाहरण लेते हैं,

इनपुट - एल=3, आर =6

स्पष्टीकरण − 3^4^5^6 =

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

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

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

बाकी सभी पूर्णांकों को ध्यान में नहीं रखा जाता है क्योंकि वे ith बिट सेट के साथ एक पूर्णांक की संख्या भी उत्पन्न करेंगे।

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

केस 2.1 - एल और आर दोनों विषम हैं, 0वें बिट के सेट के साथ पूर्णांकों की संख्या गिनें (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 = 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

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

  1. सी ++ में सरणी के सभी तत्वों पर एक्सओआर ऑपरेशन लागू करके सरणी योग को कम करना

    विवरण आकार की एक सरणी को देखते हुए, एन। एक तत्व एक्स खोजें जैसे कि सरणी तत्वों का योग न्यूनतम होना चाहिए जब एक्सओआर ऑपरेशन एक्स और सरणी के प्रत्येक तत्व के साथ किया जाता है। If input array is: arr [] = {8, 5, 7, 6, 9} then minimum sum will be 30 Binary representation of array elments are: 8 : 1000

  1. पायथन - दी गई श्रेणी के लिए सूची में सभी सम तत्वों के लिए परीक्षण करें

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