题目链接:http://www.codeup.cn/problem.php?cid=100000579&pid=2
题目描述
将一个长度最多为30位数字的十进制非负整数转换为二进制数输出。
输入
多组数据,每行为一个长度不超过30位的十进制非负整数。
(注意是10进制数字的个数可能有30个,而非30bits的整数)
输出
每行输出对应的二进制数。
样例输入
985
211
1126
样例输出
1111011001
11010011
10001100110
大数以字符串的形式输入,转化为每位的数字形式,先判断是否为0,如果为0直接输出0.
在while(1)循环中,如果数字变为0结束循环;将对个位数字取余的结果放到数组中保存,再通过for循环将这个大数除以2(例如541/2→5/2=2…1→(2*10+4)/2=7→→541/2的结果为270余1)
我真的被自己菜哭了。。。
#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
char ss[33];
int s[33];
char ans[1111];
int main(){
while(cin>>ss){
int len=strlen(ss);
int cnt=0;
for(int i=0;i<len;i++){
s[i]=ss[i]-'0';
}
//如果输入数字为0,则输出0
bool f=1;
for(int i=0;i<len;i++){
if(s[i]){
f=0;
break;
}
}
if(f){
cout<<"0"<<endl;
continue;
}
while(1){
//数字为0,循环结束
bool flag=1;
for(int i=0;i<len;i++){
if(s[i]){
flag=0;
break;
}
}
if(flag){
break;
}
//存最后一位对2取模
ans[cnt++]=s[len-1]%2+'0';
//大数除以2
for(int i=0;i<=len-1;i++){
if(s[i]%2==1){
s[i]/=2;
s[i+1]+=10;
} else{
s[i]/=2;
}
}
}
for(int i=cnt-1;i>=0;i--){
cout<<ans[i];
}
cout<<endl;
}
return 0;
}