मान लीजिए कि हमारे पास द्विआधारी रूप में एक संख्या है। हमें इन नियमों के तहत इसे घटाकर 1 करने के लिए चरणों की संख्या ज्ञात करनी होगी -
-
यदि वर्तमान संख्या सम है, तो हमें इसे 2 से भाग देना होगा।
-
यदि वर्तमान संख्या विषम है, तो आपको इसमें 1 जोड़ना होगा।
इसलिए, यदि इनपुट "1101" जैसा है, तो आउटपुट 6 होगा, क्योंकि "1101" 13 है। इसलिए, 13 विषम है, 1 जोड़ें और 14 प्राप्त करें। फिर 14 सम है, 2 से विभाजित करें और 7 प्राप्त करें। वह 7 विषम है, 1 जोड़ें और 8 प्राप्त करें।
फिर 8 फिर से है, वैसे ही, 2 से भाग दें और 4 प्राप्त करें। फिर 4 सम है, 2 से भाग दें और 2 प्राप्त करें, अंत में 2 सम है, 2 से भाग दें और 1 प्राप्त करें।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
एक फ़ंक्शन को परिभाषित करें addStrings(), यह एक सरणी num1, एक सरणी num2,
लेगा -
एक सरणी रिट परिभाषित करें
-
कैरी:=0, योग:=0
-
num1 और num2 को उल्टा करें
-
मैं:=0, जे:=0
-
जबकि (i
-
अगर i
-
योग :=कैरी + (num1[i] + num2[j])
-
रिट के अंत में योग मॉड 2 डालें
-
कैरी:=योग / 2
-
(i 1 से बढ़ाएँ)
-
(जम्मू को 1 से बढ़ाएं)
-
-
अन्यथा जब i
-
योग :=कैरी + (num1[i])
-
रिट के अंत में योग मॉड 2 डालें
-
कैरी:=योग / 2
-
(i 1 से बढ़ाएँ)
-
-
अन्यथा
-
योग :=कैरी + (num2[j])
-
रिट के अंत में योग मॉड 2 डालें
-
कैरी:=योग / 2
-
(जम्मू को 1 से बढ़ाएं)
-
-
-
यदि कैरी गैर-शून्य है, तो -
-
रिट के अंत में कैरी डालें
-
-
मैं :=रिट का आकार
-
उत्तर:=रिक्त स्ट्रिंग
-
i>=0 के लिए, अपडेट करें (i से 1 घटाएं), करें -
-
उत्तर:=उत्तर + (सेवानिवृत्त [i] + '0' का ASCII)
-
-
वापसी (यदि उत्तर का आकार 0 के समान है, तो "0", अन्यथा उत्तर)
-
फ़ंक्शन ऐडबाइनरी () को परिभाषित करें, यह एक सरणी ए, एक सरणी बी,
लेगा -
वापसी addStrings(a, b)
-
एक सरणी makeVector को परिभाषित करें और v
. से कॉपी करें-
एक सरणी रिट परिभाषित करें
-
इनिशियलाइज़ i:=0 के लिए, जब i
-
रिट के अंत में v[i] - ASCII का '0' डालें
-
-
वापसी रिट
-
-
मुख्य विधि से निम्न कार्य करें,
-
रिट:=0
-
एक सरणी x =makeVector को s से परिभाषित करें
-
जबकि x> 1 का आकार, करें −
-
(रिटर्न 1 से बढ़ाएं)
-
यदि x का अंतिम अवयव 0 के समान है, तो -
-
x से अंतिम तत्व हटाएं
-
-
अन्यथा
-
आकार 1 का एक सरणी अस्थायी परिभाषित करें
-
अस्थायी [0] :=1
-
एक्स:=मेक वेक्टर (ऐडबाइनरी (एक्स, अस्थायी))
-
-
-
वापसी रिट
उदाहरण
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
string addStrings(vector<int> num1, vector<int> num2){
vector<int> ret;
int carry = 0;
int sum = 0;
reverse(num1.begin(), num1.end());
reverse(num2.begin(), num2.end());
int i = 0;
int j = 0;
while (i < num1.size() || j < num2.size()) {
if (i < num1.size() && j < num2.size()) {
sum = carry + (num1[i]) + (num2[j]);
ret.push_back(sum % 2);
carry = sum / 2;
i++;
j++;
}
else if (i < num1.size()) {
sum = carry + (num1[i]);
ret.push_back(sum % 2);
carry = sum / 2;
i++;
}
else {
sum = carry + (num2[j]);
ret.push_back(sum % 2);
carry = sum / 2;
j++;
}
}
if (carry)
ret.push_back(carry);
i = ret.size() - 1;
string ans = "";
for (; i >= 0; i--)
ans += (ret[i] + '0');
return ans.size() == 0 ? "0" : ans;
}
string addBinary(vector<int>& a, vector<int>& b){
return addStrings(a, b);
}
vector<int> makeVector(string v){
vector<int> ret;
for (int i = 0; i < v.size(); i++)
ret.push_back(v[i] - '0');
return ret;
}
int numSteps(string s){
int ret = 0;
vector<int> x = makeVector(s);
while (x.size() > 1) {
ret++;
if (x.back() == 0) {
x.pop_back();
}
else {
vector<int> temp(1);
temp[0] = 1;
x = makeVector(addBinary(x, temp));
}
}
return ret;
}
};
main(){
Solution ob;
cout << (ob.numSteps("1101"));
} इनपुट
"1101"
आउटपुट
6