题解 | #进制转换#
进制转换
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;
}