简单思路

运用除法与取模实现进制转换。

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的余数

关键点:

  1. remain记录当前余数
  2. 更新num[i]
  3. 返回值删除前置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)

思路:

  1. 每次都用 from进制 的 num 除以 to,返回值更新 num;
  2. 直到 num为空 时,停止循环。
  3. 关于为什么为空而不是'0'? 因为divide返回的结果会删除前置0,当除以结果为'0'时删除前置0剩下空字串。

负责实现from到to的进制转换。

  • from:num的进制。
  • to:num要转换成的进制。

关键点:

  1. 每次都要更新 num 的值。
  2. 更新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")