100分求解:任意长度二进制数怎么转换为十进制数
100分求解:任意长度二进制数如何转换为十进制数
主要讨论下思路问题。
十进制转二进制我感觉容易点。。。。。
二进制转十进制却。。。。。。。。。
------解决方案--------------------
考虑到溢出问题,可用String做参数
里边也可以把这个参数截成数段,以4位一段吧
分别计算每4段的十进制值后根据各个字段在原string中的位置再分别 * 16 的几次方
------解决方案--------------------
换成十进制后还溢出的话就考虑用解决大数乘法的方法了
------解决方案--------------------
主要讨论下思路问题。
十进制转二进制我感觉容易点。。。。。
二进制转十进制却。。。。。。。。。
------解决方案--------------------
考虑到溢出问题,可用String做参数
里边也可以把这个参数截成数段,以4位一段吧
分别计算每4段的十进制值后根据各个字段在原string中的位置再分别 * 16 的几次方
------解决方案--------------------
换成十进制后还溢出的话就考虑用解决大数乘法的方法了
------解决方案--------------------
- C/C++ code
/* 对于一个十进制数A,将A转换为二进制数,然后按位逆序排列,再转换为十进制数B, 我们称B为A的二进制逆序数。 例如对于十进制数173,它的二进制形式为101011101,逆序排列得到10110101, 其十进制数为181,181即为173的二进制逆序数 输入: 一个1000位(即10^999)以内的十进制数。 输出: 输入的十进制数的二进制逆序数。 样例输入: 173 样例输出: 181 */ #include "stdio.h" #include "string.h" #define N 2000 int main(){ char a[N]; char b[4*N]; int length; scanf("%s",a); int i,k,start; int d,tmp; start=0,k=0; length=strlen(a); for(i=0;i<length;i++){ a[i]-='0'; } printf("\n\n%d\n\n", a[length-1]); while(a[length-1]!=0 || start<length){ if(a[length-1]%2==1){ b[k]=1; } else b[k]=0; k++; d=0; for(i=start;i<length;i++){ tmp=d*10+a[i]; a[i]=tmp/2; d=tmp%2; } if(a[start]==0) start++; } for(i=0;i<k;i++){ printf("%d",b[i]); } printf("\n"); int len,j; len=1; for(j=0;j<N;j++){ a[j]=0; } for(i=0;i<k;i++){ for(j=0;j<len;j++){ a[j]*=2; } j=0; while(a[j]!=0 || j<len){ if(a[j]>=10){ a[j]%=10; a[j+1]+=1; } j++; } len=j; if(b[i]==1) a[0]+=1; } for(i=len-1;i>=0;i--){ printf("%d",a[i]); } printf("\n"); return 0; }
------解决方案--------------------
“任意长度”=2^n,跟大数阶乘有异曲同工之处
------解决方案--------------------
------解决方案--------------------