简单思路
运用除法与取模实现进制转换。
PS:若涉及大于10进制的转换时,可以使用map存储数字对应的字母表示。(此处尚未考虑,思路是一样的)
(一) string divide(string num, int m, int n, char& ch)
:
负责将m进制的num转化成n进制过程中使用的除法操作。
- 函数作用:返回 (
(m进制的num)/n
) 的结果,即商。 ch传递(m进制的num)%n
的结果,即余数。 - m --- num的进制
- n --- num要转换成的进制
- ch --- num%n的余数
关键点:
remain
记录当前余数- 更新
num[i]
- 返回值删除前置0
代码:
string divide(string num, int m, int n, char& ch) { // string res = ""; int len = num.length(); int remain = 0; for(int i = 0; i<len; i++) { int t = remain*m+num[i]-'0'; num[i] = t/n+'0'; remain = t%n; } int i = 0; while (num[i]=='0') { i++; } ch = char(remain+'0'); return num.substr(i); }
(二)string change(string num, int from, int to)
:
思路:
- 每次都用 from进制 的 num 除以 to,返回值更新 num;
- 直到 num为空 时,停止循环。
- 关于为什么为空而不是'0'? 因为divide返回的结果会删除前置0,当除以结果为'0'时删除前置0剩下空字串。
负责实现from到to的进制转换。
- from:num的进制。
- to:num要转换成的进制。
关键点:
- 每次都要更新 num 的值。
- 更新res:先生成低位。
代码:
string change(string s, int from, int to) { // 转为2进制 string res = ""; while(s.size()!=0) { char bit; // int bit = (s.back()-'0') % to; // res = char(bit+'0') + res; s = divide(s, from, to, bit); res = char(bit) + res; } return res; }
完整代码
#include <iostream> #include <string> #include <algorithm> using namespace std; string divide(string num, int m, int n, char& ch) { // string res = ""; int len = num.length(); int remain = 0; for(int i = 0; i<len; i++) { int t = remain*m+num[i]-'0'; num[i] = t/n+'0'; remain = t%n; } int i = 0; while (num[i]=='0') { i++; } ch = char(remain+'0'); return num.substr(i); } string change(string s, int from, int to) { // 转为2进制 string res = ""; while(s.size()!=0) { char bit; // int bit = (s.back()-'0') % to; // res = char(bit+'0') + res; s = divide(s, from, to, bit); res = char(bit) + res; } return res; } /* string multiple(string num, int n) { // n进制转10进制 string res = ""; int carry =0; for(int i = num.length()-1; i>=0; i--) { int t = (num[i]-'0') * n + carry; res = char(t%10+'0') + res; carry = t/10; } if(carry!=0) { res = char(carry+'0') + res; } return res; } string add(string num, int n) { string res = ""; int carry = 0; for(int i = num.length()-1; i>=0; i--) { int sum = num[i]-'0'+carry; res = char(sum%10+'0') + res; carry = sum/10; } if(carry!=0) res = char(carry+'0') +res; return res; } */ int main() { string num; while (cin >> num) { // 注意 while 处理多个 case string s = change(num, 10, 2); reverse(s.begin(), s.end()); s = change(s, 2, 10); cout << s << endl; } } // 64 位输出请用 printf("%lld")