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

संख्या व्यक्त करने के लिए न्यूनतम ऑपरेटर C++ में

मान लीजिए हमारे पास एक धनात्मक पूर्णांक x है, हम x (op1) x (op2) x (op3) x ... के रूप में एक अभिव्यक्ति लिखेंगे जहां op1, op2, आदि ऑपरेटर हैं। ये ऑपरेटर जोड़, घटाव, गुणा, या भाग हो सकते हैं। कुछ नियम हैं:

  • भाग ऑपरेटर (/) परिमेय संख्याएं लौटाता है

  • कहीं भी कोष्ठक नहीं रखे जाते

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

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

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

उदाहरण के लिए, यदि x = 4, लक्ष्य = 15, तो आउटपुट 3 होगा, क्योंकि हम 15 को 4*4 - 4/4 के रूप में व्यक्त कर सकते हैं।

हल करने का दृष्टिकोण

हम x की घातों के आधार पर एक लालची पुनरावर्ती दृष्टिकोण का उपयोग करते हैं:

  • यदि लक्ष्य == x, तो 0 ऑपरेटर चाहिए

  • यदि x > लक्ष्य, तो min((x-target)*2, target*2-1) वापस करें

  • x की घातों को तब तक गुणा करें जब तक sum >= लक्ष्य

  • यदि sum == लक्ष्य, तो उपयोग की गई घातें वापस करें

  • अन्यथा, दो विकल्पों पर पुनरावर्ती करें: sum - लक्ष्य और लक्ष्य - sum/x

  • न्यूनतम लें और 1 जोड़ें

उदाहरण

#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; 
    } 
}; 

int main(){ 
    Solution ob; 
    cout << (ob.leastOpsExpressTarget(4, 15)); 
    return 0;
}

इनपुट

4, 15

आउटपुट

3
  1. - C++ में मितव्ययी संख्या (Frugal Number)

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

  1. C++ में पेंटाटोप संख्या C++ में पेंटाटोप संख्या

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

  1. - C++ में सरणी में निकटतम संख्या ज्ञात करें

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