题目要求可以处理30位长度的十进制数。
普通十进制数n转x进制的过程是
- 取余:res[k++]=n%x;
- 整除:n/=x;
重复直到n为0;
由于十进制数为30位,只能把整数转化为字符串来处理。延续之前的思想,仍然是取余和整除两步
- 取余:将取余转化成对字符串最低位进行取模运算,和普通的直接用数字取模相比,二者在功能上等价
- 整除:字符串对x取模,从高位到低位,依次除x,每次除法运算,得到的商存起来,最后按序排列好即为除法的结果,得到的余数y的作用是,y*10,再加上下一位的值,即为下一次除法的被除数
#include<iostream>
using namespace std;
int res[300];
string Div(string s,int x){ //字符串s/x
int flag=1; //表示是0,还没找到正式开头
string result="";
int temp=0;
for(int i=0;i<s.length();i++){
temp=temp*10+s[i]-'0';
if(temp/x+'0'!='0'){
flag=0;
}
if(flag==0){
result+=temp/x+'0';
}
temp=temp%x;
}
return result;
}
int main(){
string s="";
while(cin>>s){
int k=0;
long long sum=0;
if(s=="0"){
cout<<"0"<<endl;
}
else{
while(s.length()){
int last=s[s.length()-1]%2; //取模当成对字符串中的最低数位取模,二者效果相同
res[k++]=last;
//除二操作
s=Div(s,2);
}
//输出
int flag=0;
for(int i=k-1;i>=0;i--){
if(res[i]==1){
flag=1;
}
if(flag==1){
cout<<res[i];
}
}
cout<<endl;
}
}
return 0;
}