问题 C: 进制转换(十进制数长度超过30位)模拟短除法执行过程

版权声明:本文为博主原创文章,转载请注明出处 https://blog.csdn.net/xunalove/article/details/87880850

题目描述

将一个长度最多为30位数字的十进制非负整数转换为二进制数输出。
输入

多组数据,每行为一个长度不超过30位的十进制非负整数。
(注意是10进制数字的个数可能有30个,而非30bits的整数)
输出

每行输出对应的二进制数。
样例输入

985
211
1126

样例输出

1111011001
11010011
10001100110

因为要求10进制数字大约不超过30个,long long int大约范围大约为 1 0 18 10^{18} 所以输入必须使用字符数组,然后模拟短除法执行的过程。

#include<stdio.h>
#include<string.h>
int main()
{

   char a[32];
   while(scanf("%s",&a)!=EOF)
   {
       int b[32]={0};
       for(int i=0; i<strlen(a); i++)//将字符串转换为整数数组
           b[i] = a[i] - '0';

       int len = strlen(a),k=0,c=0, i=0;
       char ans[200];
       //printf("len = %d\n",len);
       while(i<len){
            ans[k++] = (b[len-1] % 2) + '0';
            c  = 0;//每一轮要清0
           //模拟一次整数除2的过程
           for(int j=i; j<len; j++)
           {
               int temp = b[j];
               b[j] = (b[j]+c) / 2 ;
               if(temp%2==1)//高位不够除2,把当前位借给后一位
                  c = 10;
               else
                  c = 0;
               if(b[i] == 0)
                 i++;
           }
        }
        //printf("k==%d\n",k);
        for(int i=k-1; i>=0; i--)
            printf("%c",ans[i]);
        printf("\n");
   }
}

猜你喜欢

转载自blog.csdn.net/xunalove/article/details/87880850
今日推荐