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

C++ में पावर वैल्यू के आधार पर पूर्णांकों को छाँटें


जैसा कि हम जानते हैं कि एक पूर्णांक x की शक्ति को निम्नलिखित चरणों का उपयोग करके x को 1 में बदलने के लिए आवश्यक चरणों की संख्या के रूप में परिभाषित किया गया है -

  • यदि x सम है तो x =x/2

  • यदि x विषम है तो x =3 * x + 1

तो उदाहरण के लिए, x =3 की शक्ति 7 है क्योंकि 3 बनने के लिए 3 चरणों का उपयोग करता है (3 → 10 → 5 → 16 → 8 → 4 → 2 → 1)। इसलिए यदि हमारे पास कुछ पूर्णांक lo, hi और k हैं। हमें अंतराल [lo, hi] के सभी पूर्णांकों को घातांक के अनुसार आरोही क्रम में क्रमबद्ध करना है। अब यदि दो या दो से अधिक पूर्णांकों का घातांक समान है, तो उन्हें आरोही क्रम से क्रमबद्ध करें। हमें k-वें पूर्णांक को श्रेणी [lo, hi] में घात मान के अनुसार क्रमबद्ध करना होगा।

उदाहरण के लिए, यदि इनपुट lo =12, hi =15 और k =2 जैसा है, तो आउटपुट 13 होगा। ऐसा इसलिए है क्योंकि 12 की शक्ति 9 है, 13 की शक्ति 9 है, 14 के लिए यह 17 है, और 15 के लिए यह 17 भी है, इसलिए क्रमबद्ध क्रम [12,13,14,15] है और k =2 के रूप में, तो तत्व 13 है।

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -

  • GetTurn विधि को परिभाषित करें, यह n को इनपुट के रूप में लेगा

  • रिट:=0

  • जबकि n 1 नहीं है

    • यदि n विषम है, तो n :=n * 3 + 1, अन्यथा n :=n/2

    • रिट को 1 से बढ़ाएं

  • मुख्य विधि से

  • क्योंकि मैं लो से हाय तक की सीमा में हूं

    • एक जोड़ी बनाएं (getTurn(i), i)

    • रिट में अस्थायी डालें

  • जोड़े को शक्ति के आधार पर क्रमबद्ध करें, अन्यथा आरोही क्रम में

  • जोड़ी का दूसरा मान लौटाएं ret[k - 1]

उदाहरण (C++)

आइए एक बेहतर समझ प्राप्त करने के लिए निम्नलिखित कार्यान्वयन देखें -

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   vector < pair <int, int> > ret;
   static bool cmp(pair <int, int>& a, pair <int, int>& b){
      return a.first == b.first ? a.second < b.second : a.first < b.first;
   }
   int getTurn(int n){
      int ret = 0;
      while(n != 1){
         if(n & 1){
            n = n * 3 + 1;
         }
         else n >>= 1;
            ret ++;
      }
      return ret;
   }
   int getKth(int lo, int hi, int k) {
      for(int i = lo; i <= hi; i++){
         pair <int, int> temp;
         temp.first = getTurn(i);
         temp.second = i;
         ret.push_back(temp);
      }
      sort(ret.begin(), ret.end(), cmp);
      return ret[k - 1].second;
   }
};
main(){
   Solution ob;
   cout << (ob.getKth(12, 15, 2));
}

इनपुट

12
15
2

आउटपुट

13

  1. C++ . में भूलभुलैया III

    मान लीजिए कि खाली जगह और दीवारों के साथ एक भूलभुलैया है और उस भूलभुलैया में एक गेंद भी है। गेंद ऊपर (यू), नीचे (डी), बाएं (एल) या दाएं (आर) दिशाओं को लुढ़क कर खाली जगहों से जा सकती है, लेकिन यह दीवार से टकराने तक लुढ़कती रहती है। जब गेंद रुकती है, तो वह अगली दिशा चुन सकती है। उस भूलभुलैया में एक छेद

  1. सी ++ में टेम्पलेट मेटाप्रोग्रामिंग

    जब हम एक टेम्पलेट का उपयोग करके संकलन समय पर गणना करने के लिए प्रोग्राम लिखते हैं, जिसे टेम्प्लेट मेटाप्रोग्रामिंग कहा जाता है। उदाहरण कोड #include <iostream> using namespace std; template<int n>struct power {    enum { value = 4*power<n-1>::value }; }; template<>

  1. सी ++ प्रोग्राम शेकर सॉर्ट करने के लिए

    दिए गए डेटा को सॉर्ट करने के लिए शेकर सॉर्ट का उपयोग किया जाता है। बबल सॉर्ट के विपरीत, शेकर सॉर्ट, दोनों दिशाओं में सरणी को ऑर्डर करता है। इस एल्गोरिथम की सबसे खराब जटिलता O(n^2) है। एल्गोरिदम Begin    ShakerSort() function has ‘arr’ the array of data and ‘n’ the n