100分求解:任意长度二进制数如何转换为十进制数
主要讨论下思路问题。
十进制转二进制我感觉容易点。。。。。
二进制转十进制却。。。。。。。。。
[解决办法]
考虑到溢出问题,可用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 2000int 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,跟大数阶乘有异曲同工之处
[解决办法]
[解决办法]