题解 | 10进制 VS 2进制
10进制 VS 2进制
https://www.nowcoder.com/practice/fd972d5d5cf04dd4bb4e5f027d4fc11e
//字符串除法从高位开始考虑 字符串乘法从低位开始考虑,与平时数字计算相似
#include <iostream>
#include <string>
#include <stack>
using namespace std;
string Divide(string s, int x) {//一千位的十进制数用字符串处理
int remainder = 0;
for (int i = 0; i < s.size(); i++) {
int cur = remainder * 10 + s[i] - '0';
s[i] = cur / x + '0';
remainder = cur % x;
}
int pos = 0;
while (s[pos] == '0') {
pos++;
}
return s.substr(pos);
}
string convertFunc1(string s, int x) {//十转二
stack<int> sck;
while (s.size() != 0) {
int bit = (s[s.size()-1] - '0') % 2; //整个数%2 和 最后一位%2的结果一样
sck.push(bit);
s = Divide(s, x);
}
string res;
while (!sck.empty()) {
res.push_back(sck.top()+'0');
sck.pop();
}
return res;
}
string Multiple(string str, int x) { //字符串乘法 用于二转十 实现十进制字符串和十进制整型乘法
int carry = 0; //进位
for (int i = str.size() - 1; i >= 0; i--) {//低位开始考虑
int cur = x * (str[i] - '0') + carry;
str[i] = cur % 10 + '0';
carry = cur / 10;
}
if (carry != 0) {
str = "1" + str; //乘2进位只能是1,如果乘大于2的整数,则应加上进位
}
return str;
}
string Add(string str, int x) { //字符串加法
int carry = x;
for (int i = str.size() - 1; i >= 0; i--) {
int cur = (str[i] - '0') + carry;
str[i] = cur % 10 + '0';
carry = cur / 10;
}
if (carry != 0) {
str = "1" + str; //在两个十进制数正常逐位相加时,每一位产生的进位是 0 或者 1
}
return str;
}
string convertFunc2(string s, int x) {//二转十
string ans = "0";
for (int i = s.size() - 1; i >= 0; i--) { //从最低二进制位开始
ans = Multiple(ans, x);
ans = Add(ans, s[i]-'0');
}
return ans;
}
int main()
{
string s;
while (cin >> s) {
cout << convertFunc2(convertFunc1(s, 2), 2);
}
return 0;
}
进制转换问题 文章被收录于专栏
包括任意进制的转换(m转n,先m转10,再10转n) 和大整型的进制转换(0.利用字符串存储大整型 1.实现字符串除法以完成10转n 2.实现字符串加法和字符串乘法以完成m转十
查看9道真题和解析
vivo公司福利 364人发布