题解 | 进制转换
#include <bits/stdc++.h>
using namespace std;
//double 在cpp中是无法使用%的,所以必须要实现大数除法
string Divide(string s,int x){
int remainder = 0;
for(int i=0;i<s.size();i++){
int current = remainder * 10 + s[i] - '0';//模拟手动除法,当前除算内容
s[i] = current / x +'0';//取到上面的值,直接存在这个位置刚刚好
remainder = current % x;//求下次的余数
}//计算机就是人类逻辑的底层拆解
int pos=0;
while(s[pos]=='0') pos++;//注意到,除不到的时候我们计算中是空过去的,实际上是写入了0,所以用此截断
return s.substr(pos);
}
int main(){
//根据特性,可以发现,取余数是这样的
string s;
while(cin>>s){
string a;
while(s.size()!=0){
int last = s[s.size()-1]-'0';
a.push_back(last%2+'0');
s = Divide(s,2);
}
reverse(a.begin(),a.end());
cout<<a<<endl;
}
}
核心思路是30位,所以只需要实现大数除法即可。大数除法是也可以得到余数的,但是我们不需要这样做,我们最后的结果就是除二,余数其实就是尾一位求模即可,所以直接算余数,然后算一个大数除法算出来除法结果,对于大数除法,有一点需要注意,就是我们对大数除法的结果进行了截断,因为根据除法原理,会得到如121/2=060,所以前面的0是无意义的,需要截断
查看6道真题和解析