采用大数除法来实现进制转换,容易错的一个误区在于不用执着于利用字符串的最后一位进行求余,当你从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;
}