问题 C: 进制转换
时间限制: 1 Sec 内存限制: 32 MB
题目描述
将一个长度最多为30位数字的十进制非负整数转换为二进制数输出。
输入
多组数据,每行为一个长度不超过30位的十进制非负整数。
(注意是10进制数字的个数可能有30个,而非30bits的整数)
输出
每行输出对应的二进制数。
样例输入
985 211 1126
样例输出
1111011001 11010011 10001100110
大数的除法思路:
#include<stdio.h>
#include<string.h>
int main()
{
char arr[32];//输入
int input[32];//输入的十进制形式
int output[100];//输出
int len;
while(scanf("%s",arr)!=EOF)
{
len=strlen(arr);
for(int i=0;i<len;i++)
{
input[i]=arr[i]-'0';
}
memset(output,0,sizeof(output));
int sum=1;//保存每次除法的商之和 主要用于判断这次除法是否结束
int d=0;//商
int k=0;//output数组要使用
while(sum)
{
sum=0;
for(int i=0;i<len;i++)//从高位到低位进行除法模拟运算
{
//先得到商
d=input[i]/2;
sum=sum+d;
if(i==len-1)//本次除法即将结束 要将最后一位的余数放到output数组中
{
output[k++]=input[i]%2;
}
else
{
input[i+1]=input[i+1]+(input[i]%2)*10;//(本次的余数*10)+(下一位的数值)=下一位除法的被除数
}
input[i]=d;//跟新一下input,以便下一次除法使用
}
}
if(k==0)
{
printf("0");
}
else
{
for(int i=k-1;i>=0;i--)//逆序输出
{
printf("%d",output[i]);
}
}
printf("\n");
}
return 0;
}