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

श्रेणी के सबसे बड़े विषम भाजक के XOR पर C++ प्रश्न

एन पूर्णांकों की एक सरणी और श्रेणियों के क्यू प्रश्नों को देखते हुए। प्रत्येक क्वेरी के लिए, हमें श्रेणी में प्रत्येक संख्या के सबसे बड़े विषम भाजक का XOR वापस करना होगा।

सबसे बड़ा विषम भाजक वह सबसे बड़ी विषम संख्या है जो संख्या N को विभाजित कर सकती है, उदा। उदाहरण के लिए, 6 का सबसे बड़ा विषम भाजक 3 है।

Input: nums[ ] = { 3, 6, 7, 10 }, query[ ] = { { 0, 2 }, { 1, 3 } }
Output:
query1: 7
query2: 1

Explanation: greatest odd divisors of nums array are { 3, 3, 7, 5 }.
For query 1 we need to find the XOR of indexes 0, 1, and 2 which is 7, and for query2 we need to find XOR of indexes 1, 2, and 3 which is 1.

समाधान खोजने के लिए दृष्टिकोण

सरल तरीका

सबसे पहले, सरल दृष्टिकोण में, हमें सभी सरणी तत्वों के सबसे बड़े विषम भाजक को खोजने की आवश्यकता है। फिर क्वेरी की सीमा के अनुसार, हमें श्रेणी में प्रत्येक तत्व के XOR की गणना करने और वापस लौटने की आवश्यकता है।

कुशल दृष्टिकोण

इस समस्या को हल करने का एक प्रभावी तरीका यह है कि हर बार श्रेणी में प्रत्येक संख्या के XOR को खोजने के बजाय सबसे बड़ी विषम भाजक संख्या वाले सरणी का एक उपसर्ग XOR सरणी उपसर्ग_XOR [] बनाया जाए और उपसर्ग_XOR [R] - उपसर्ग_XOR [L-1 को वापस किया जाए। ].

उपसर्ग xor सरणी वह सरणी है जिसमें प्रत्येक तत्व में पिछले सभी तत्वों का xor होता है।

उदाहरण

#include <bits/stdc++.h>
using namespace std;
int main(){
    int nums[] = { 3, 6, 7, 10 };
    int n = sizeof(nums) / sizeof(nums[0]);
    int prefix_XOR[n];
    // creating an array
    // containing Greatest odd divisor of each element.
    for (int i = 0; i < n; i++) {
        while (nums[i] % 2 != 1)
            nums[i] /= 2;
        prefix_XOR[i] = nums[i];
    }
    // changing prefix_XOR array to prefix xor array.
    for (int i = 1; i < n; i++)
        prefix_XOR[i] = prefix_XOR[i - 1] ^ prefix_XOR[i];
    // query array to find result of these queries.
    int query[2][2] = {{0, 2},{1, 3}};
    int q = sizeof(query) / sizeof(query[0]);
    // finding results of queries.
    for(int i = 0;i<q;i++){
        if (query[i][0] == 0)
            cout<<  prefix_XOR[query[i][1]] << endl;
        else{
            int result = prefix_XOR[query[0][1]] ^ prefix_XOR[query[i][0] - 1];
            cout <<  result << endl;
        }
    }
    return 0;
}

आउटपुट

7
4

उपरोक्त कोड की व्याख्या

  • उपसर्ग_XOR सरणी प्रत्येक तत्व के सबसे बड़े विषम भाजक को संग्रहीत करने के लिए बनाई गई है और फिर इस सरणी को उपसर्ग XOR सरणी में बदल देती है।

  • सबसे बड़े विषम भाजक की गणना इसे दो से विभाजित करके की जाती है जब तक कि यह मॉड्यूल 2 1 नहीं देता है।

  • उपसर्ग xor सरणी सरणी के माध्यम से ट्रैवर्स करके और पिछले तत्व के साथ वर्तमान तत्व के बिटवाइज़ XOR करके बनाई गई है।

  • एक क्वेरी के परिणाम की गणना prefix_XOR[] सरणी के दाएँ अनुक्रमणिका को (बाएं -1) उपसर्ग_XOR[] सरणी के अनुक्रमणिका से घटाकर की जाती है।

निष्कर्ष

इस ट्यूटोरियल में, हमने एक समस्या पर चर्चा की जहां हमें दिए गए सरणी की सीमा में प्रत्येक संख्या के सबसे बड़े विषम भाजक के XOR को खोजने की आवश्यकता है। हमने प्रत्येक तत्व का सबसे बड़ा विषम भाजक ढूंढकर और उपसर्ग xor सरणी का उपयोग करके इस समस्या को हल करने के लिए एक दृष्टिकोण पर चर्चा की। हमने इस समस्या के लिए C++ प्रोग्राम पर भी चर्चा की जिसे हम प्रोग्रामिंग भाषाओं जैसे C, Java, Python, आदि के साथ कर सकते हैं। हमें उम्मीद है कि आपको यह लेख मददगार लगा होगा।


  1. सी ++ में सरणी में श्रेणी का मतलब

    इस समस्या में, हमें n पूर्णांकों की एक सरणी और कुछ m प्रश्न दिए गए हैं। हमारा काम एक ऐसा प्रोग्राम बनाना है जो प्रश्नों द्वारा दी गई श्रेणियों के माध्य के अभिन्न मूल्य (राउंड डाउन) की गणना करता है। समस्या को समझने के लिए एक उदाहरण लेते हैं, इनपुट - array = {5, 7, 8, 9, 10} m = 2; [0, 3], [2, 4] आ

  1. C++ में किसी सरणी की माध्यिका को अधिकतम करें

    समस्या कथन N तत्वों की एक सरणी arr[] और एक पूर्णांक K जहां K

  1. अद्यतन के बिना श्रेणी योग प्रश्नों के लिए सी ++ कार्यक्रम?

    हमें अनुक्रमणिका i से अनुक्रमणिका j तक के तत्वों के योग की गणना करने की आवश्यकता है। i और j इंडेक्स मानों वाली क्वेरी को कई बार निष्पादित किया जाएगा। Input:arr[] = {5, 6, 3, 4, 1 } i = 1, j =3 Output: 13 स्पष्टीकरण 6 + 3 + 4 = 13 sum[] = {5, 6+5, 3+6+5, 4+3+6+5, 1+4+3+6+5 } sum[]={5,11,14,18,19}