版权声明:本文为博主原创文章,未经博主允许不得转载 https://blog.csdn.net/zhang__shuang_/article/details/87469689
题目描述
将一个长度最多为30位数字的十进制非负整数转换为二进制数输出。
输入描述:
多组数据,每行为一个长度不超过30位的十进制非负整数。
(注意是10进制数字的个数可能有30个,而非30bits的整数)
输出描述:
每行输出对应的二进制数。
输入
0
1
3
8
输出
0
1
11
1000
C++实现:
#include<iostream>
#include<string.h>
using namespace std;
int main(){
char c[30];
char b[200];
int a[30];
cin>>c;
int Num=strlen(c);
for(int i=0;i<Num;i++){
a[i]=c[i]-'0';
}
int num=1;
int k=0;
int j=0;
//判断num为0,若为0,表示a数组内所有位均<2,此时循环结束
while(num){
num=0;
for(int i=0;i<Num;i++){
//思路为每一位除以2,当前位为偶数,下一位为0,当前位为奇数,则下一位为当前位*10+下一位原值
k=a[i]/2;
num+=k;
if(i==Num-1)
b[j++]=a[i]%2+'0';
else
a[i+1]+=a[i]%2*10;
a[i]=k;
}
}
for(int i=j-1;i>=0;i--){
cout<<b[i];
}
cout<<endl;
}
另一种实现:
#include<iostream>
#include<string.h>
using namespace std;
int main(){
char c[30];
int num[30];
int re[150];
while(cin>>c){
int len=strlen(c);
for(int i=0;i<len;i++){
num[i]=c[i]-'0';
}
int r=1;
int q=0;
while(r){
r=0;
int next=0;
int sum=0;
for(int i=0;i<len;i++){
//此处应与1比较,
if(num[i]>=1)
r++;
sum=num[i]+next*10;
num[i]=sum/2;
next=sum%2;
if(i==len-1){
re[q++]=sum%2;
}
}
}
//注意最后的商0也压入了数组中,因此从q-2开始遍历
for(int i=q-2;i>=0;i--)
cout<<re[i];
cout<<endl;
}
}