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

C++ में नंबर एक्सप्रेस करने के लिए कम से कम ऑपरेटर्स

मान लीजिए कि हमारे पास एक धनात्मक पूर्णांक x है, हम x (op1) x (op2) x (op3) x ... के रूप का व्यंजक लिखेंगे, जहां op1, op2, आदि संचालिका हैं। और ये ऑपरेटर या तो जोड़, घटाव, गुणा या भाग हो सकते हैं। उदाहरण के लिए, x =3 के साथ, हम 3 * 3 / 3 + 3 - 3 लिख सकते हैं जो कि 3 का मान है। कुछ नियम हैं, ये इस प्रकार हैं -

  • विभाजन संचालिका (/) परिमेय संख्याएँ लौटाता है।

  • कहीं भी कोई कोष्ठक नहीं रखा गया है।

  • हम संचालन के सामान्य क्रम का उपयोग करते हैं - गुणा और भाग में जोड़ और घटाव की तुलना में उच्च प्राथमिकता होती है।

  • यूनरी नेगेशन ऑपरेटर की अनुमति नहीं है।

हमें कम से कम ऑपरेटरों के साथ एक अभिव्यक्ति लिखनी है जैसे कि अभिव्यक्ति दिए गए लक्ष्य के बराबर है। इसलिए, हम ऑपरेटरों की सबसे कम संख्या पाएंगे।

इसलिए, यदि इनपुट x =4, लक्ष्य =15 जैसा है, तो आउटपुट 3 होगा, क्योंकि हम 15 को 4*4- 4/4

के रूप में व्यक्त कर सकते हैं।

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

  • यदि लक्ष्य x के समान है, तो -

    • यदि x> लक्ष्य है, तो −

      • कम से कम (x - लक्ष्य) * 2 और (लक्ष्य * 2) - 1

  • योग:=एक्स, टी:=0

  • जबकि योग <लक्ष्य, करें -

    • योग :=योग * x

    • (टी 1 से बढ़ाएँ)

  • यदि योग लक्ष्य के समान है, तो -

    • वापसी टी

  • एल:=इंफ, आर:=इंफ

  • यदि योग - लक्ष्य लक्ष्य, तो -

    • r :=कम से कमOpsExpressTarget(x, योग - लक्ष्य)

  • एल :=कम से कमOpsExpressTarget(x, लक्ष्य - (योग / x))

  • वापसी 1 + न्यूनतम l और r

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

उदाहरण

#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
class Solution {
   public:
   int leastOpsExpressTarget(int x, int target) {
      if(target == x) return 0;
      if(x > target){
         return min((x - target) * 2, (target * 2) - 1);
      }
      lli sum = x;
      int t = 0;
      while(sum < target){
         sum *= x;
         t++;
      }
      if(sum == target) return t;
      int l = INT_MAX;
      int r = INT_MAX;
      if(sum - target < target){
         r = leastOpsExpressTarget(x, sum - target) + t;
      }
      l = leastOpsExpressTarget(x, target - (sum / x)) + t - 1;
      return min(l, r) + 1;
   }
};
main(){
   Solution ob;
   cout << (ob.leastOpsExpressTarget(4, 15));
}

इनपुट

4, 15

आउटपुट

3

  1. C++ में मितव्ययी संख्या

    इस समस्या में, हमें एक धनात्मक पूर्णांक N दिया जाता है। हमारा कार्य यह जाँचने के लिए एक प्रोग्राम बनाना है कि दी गई संख्या मितव्ययी संख्या है या नहीं। मितव्ययी संख्या - एक संख्या जिसके अंकों की संख्या दी गई संख्या के अभाज्य गुणनखंड में अंकों की संख्या से अधिक है। उदाहरण − 625, संख्या 625 का अभाज्

  1. सी++ पेंटाटोप नंबर

    पास्कल के त्रिभुज में एक पंचकोण संख्या को पाँचवीं संख्या के रूप में वर्णित किया गया है। अब, जैसा कि आप जानते हैं, यह पांचवीं संख्या है, तो इसका मतलब है कि हमारे पास पास्कल के त्रिकोण में कम से कम पांच संख्याएं होनी चाहिए, इसलिए इस श्रृंखला की पहली संख्या 1 4 6 4 1 से शुरू होती है। पास्कल त्रिभुज की

  1. सी ++ में सरणी में निकटतम संख्या पाएं

    मान लीजिए कि हमारे पास n तत्वों के साथ एक सरणी A है। और तत्वों को क्रमबद्ध किया जाता है। हमें दिए गए पूर्णांक का निकटतम मान ज्ञात करना है। सरणी में डुप्लिकेट मान और ऋणात्मक संख्याएँ हो सकती हैं। तो अगर सरणी [2, 5, 6, 7, 8, 8, 9] की तरह है और लक्ष्य संख्या 4 है, तो निकटतम तत्व 5 है। हम दिए गए सरणी क