(算法)大数的进制转换
题目描述
将一个长度最多为30位数字的十进制非负整数转换为二进制数输出输入描述:
多组数据,每行为一个长度不超过30位的十进制非负整数。
(注意是10进制数字的个数可能有30个,而非30bits的整数)
解析
例子 :123,设二进制数组为w[]
-
w[i++]:123//2=?..1
-
? 作为下一个的除数: 1//2=0…1(余1加10)
(10+2)//2=6…0(余0加0)
(0+3)//2=1…1(余1,此处的1就是上一条的1)
得到?为 ()61 -
将61填入重复上述过程
-
…
代码
#include <stdio.h>
#include <string.h>char s[35];
char buf[205];//结果int main(){int num[35];while(scanf("%s",s)!=EOF){//按位保存int len = strlen(s);for(int i=0;i<len;i++){num[i]=s[i]-'0';}int i=0;int len_str = 0;//一位一位处理while(i<len){int c=0;//从末位判断是1还是0buf[len_str++] = (num[len-1])%2+'0';//更新num数组,存储每次的商,作为下一次的除数for(int j=i;j<len;j++){int temp=num[j];num[j] = (num[j]+c)/2;if(temp%2 == 1){c = 10;}else {c=0;}if(num[i]==0)i++;}}for(int i=len_str-1;i>=0;i--){printf("%c",buf[i]);}printf("\n");}return 0;
}