采用大数除法来实现进制转换,容易错的一个误区在于不用执着于利用字符串的最后一位进行求余,当你从m进制转换为n进制且n > m时不能这么做, 只能通过大数除法做除留余数进行进制转换.
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
// 实行M/N的除法,同时利用remainder保留余数
string divString(string num, int m, int n, int &remainder) {
string ans;
int x = 0;
// 模拟除法过程
for (int i = 0; i < num.size(); i++) {
int cur = 0;
if ('0' <= num[i] && num[i] <= '9')
cur = num[i] - '0' + x * m;
else
cur = num[i] - 'A' + 10 + x * m;
// 不够则上商0
if (cur / n < 10) ans += cur / n + '0';
else ans += cur / n - 10 + 'A';
// 求余,余数进入下一轮运算
x = cur % n;
}
// 保留余数
remainder = x;
int pos = 0;
// 清理前缀0
while (ans[pos] == '0' && pos < ans.size()) pos++;
if (pos == ans.size()) return "0";
else return ans.substr(pos);
}
int main() {
string num;
while (cin >> num) {
string str = num;
string ans = "";
int remainder = 0;
// 不断除n直至除尽
while (str != "0") {
str = divString(str, 10, 2, remainder);
// 将原字符串转换为n进制,不采取insert是为了让其逆序
ans += remainder + '0';
}
str = ans;
ans = "";
// 再次将逆序的字符串转换回m进制
while (str != "0") {
str = divString(str, 2, 10, remainder);
ans.insert(0, 1, remainder + '0');
}
cout << ans << endl;
}
return 0;
}

京公网安备 11010502036488号