题解 | #10进制 VS 2进制#
10进制 VS 2进制
https://www.nowcoder.com/practice/fd972d5d5cf04dd4bb4e5f027d4fc11e
#include <iostream>
using namespace std;
string divide2(string s) {//大数除二
string ans;
int remainer = 0;
for (int i = 0; i < s.size(); i++) {
int temp = remainer * 10 + s[i] - '0';
ans += temp / 2 + '0';
remainer = temp % 2;
}
int pos = 0;
while (ans[pos] == '0') pos++;
ans = ans.substr(pos);
if (ans.size() == 0) ans = "0";
return ans;
}
string multiply2(string s) {//大数乘二
string ans;
int carry = 0;
for (int i = s.size() - 1; i >= 0; i--) {
int temp = (s[i] - '0') * 2 + carry;
ans = to_string(temp % 10) + ans;
carry = temp / 10;
}
if (carry != 0) ans = to_string(carry) + ans;
return ans;
}
string add(string s,int a) {//大数加0或1
string ans;
int carry = a;
for (int i = s.size() - 1; i >= 0; i--) {
int temp = s[i] - '0' + carry;
ans = to_string(temp % 10) + ans;
carry = temp / 10;
}
if (carry != 0) ans = to_string(carry) + ans;
return ans;
}
string toBinary(string decStr) {//转二进制取余除二
string ans;
if (decStr == "0") ans = "0";
while (decStr != "0") {
ans = to_string((decStr[decStr.size() - 1] - '0') % 2) + ans;
decStr = divide2(decStr);
}
return ans;
}
string reverseToDec(string binaryStr) {//二进制转10进制从高到低,逆序则从低到高
string ans = "0";
for (int i = binaryStr.size()-1; i >=0; i--) {
ans = multiply2(ans);
ans = add(ans, binaryStr[i] - '0');
}
return ans;
}
int main() {
string a;
while (cin >> a ) { // 注意 while 处理多个 case
cout << reverseToDec(toBinary(a)) << endl;
}
}
// 64 位输出请用 printf("%lld")
查看1道真题和解析

