题解 | #进制转换#
进制转换
http://www.nowcoder.com/practice/0337e32b1e5543a19fa380e36d9343d7
关键在于对于字符串模拟的数字,不断的进行对2取模,对2整除的运算,即可求出结果。
对于取模运算,可以转换为对字符串低位进行取模的运算,二者功能上是等价的。
对于整除运算,需要重写一个函数来完成字符串除法的功能。将字符串从高到低逐位除以除数,如果某位不能整除,那么就保留该位数除以除数的余数,余数乘以10以后和低一位的一起进行处理。这样就可以模拟出除法的效果,但是也会导致出现多个前置0。
#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 convertFunc(string s, int x) {
    stack<int> sck;
    while (s.size() != 0) {
        int bit = (s[s.size()-1] - '0') % 2;
        sck.push(bit);
        s = Divide(s, x);
    }
    string res;
    while (!sck.empty()) {
        res.push_back(sck.top()+'0');
        sck.pop();
    }
    return res;
}
int main()
{
    string s;
    while (cin >> s) {
        cout << convertFunc(s, 2) << endl;
    }
    return 0;
}
 查看9道真题和解析
查看9道真题和解析