Giả sử chúng ta có một số s ở dạng nhị phân. Chúng tôi phải tìm số bước để giảm nó xuống còn 1 theo các quy tắc này -
-
Nếu số hiện tại là số chẵn, chúng ta phải chia nó cho 2.
-
Nếu số hiện tại là số lẻ, bạn phải thêm 1 vào số đó.
Vì vậy, nếu đầu vào là "1101", thì đầu ra sẽ là 6, như "1101" là 13. Vì vậy, 13 là số lẻ, thêm 1 và nhận được 14. Sau đó, 14 là chẵn, chia cho 2 và thu được 7. Sau 7 là số lẻ, thêm 1 và nhận được 8.
Sau đó 8 lại là chẵn, chia cho 2 và được 4. Lại 4 là chẵn, chia cho 2 được 2, cuối cùng là 2 chẵn, chia cho 2 được 1.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
-
Xác định một hàm addStrings (), điều này sẽ nhận một mảng num1, một mảng num2,
-
Xác định ret mảng
-
mang:=0, sum:=0
-
đảo ngược num1 và num2
-
i:=0, j:=0
-
while (i
-
nếu tôi
-
sum:=carry + (num1 [i] + num2 [j])
-
chèn sum mod 2 vào cuối ret
-
mang:=sum / 2
-
(tăng tôi lên 1)
-
(tăng j lên 1)
-
-
ngược lại khi tôi
-
sum:=carry + (num1 [i])
-
chèn sum mod 2 vào cuối ret
-
mang:=sum / 2
-
(tăng tôi lên 1)
-
-
Nếu không
-
sum:=carry + (num2 [j])
-
chèn sum mod 2 vào cuối ret
-
mang:=sum / 2
-
(tăng j lên 1)
-
-
-
nếu carry là khác 0, thì -
-
chèn mang vào cuối ret
-
-
i:=kích thước của ret
-
ans:=chuỗi trống
-
đối với i> =0, cập nhật (giảm i đi 1), thực hiện -
-
ans:=ans + (ret [i] + ASCII của '0')
-
-
return (nếu kích thước của ans bằng 0 thì là "0", ngược lại là ans)
-
Xác định một hàm addBinary (), điều này sẽ nhận một mảng a, một mảng b,
-
trả về addStrings (a, b)
-
Xác định một makeVector mảng và sao chép từ v
-
Xác định ret mảng
-
để khởi tạo i:=0, khi i
-
insert v [i] - ASCII of '0' vào cuối ret
-
-
trả lại ret
-
-
Từ phương thức chính, hãy làm như sau,
-
ret:=0
-
Xác định một mảng x =makeVector từ s
-
trong khi kích thước x> 1, do -
-
(tăng ret lên 1)
-
nếu phần tử cuối cùng của x giống 0, thì -
-
xóa phần tử cuối cùng khỏi x
-
-
Nếu không
-
Xác định nhiệt độ mảng có kích thước 1
-
tạm thời [0]:=1
-
x:=makeVector (addBinary (x, temp))
-
-
-
trả lại ret
Ví dụ
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
#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")); }
Đầu vào
"1101"
Đầu ra
6