读书人

100分求解:任意长度二进制数怎么转换

发布时间: 2014-05-31 16:23:30 作者: rapoo

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,跟大数阶乘有异曲同工之处
[解决办法]
探讨
“任意长度”=2^n,跟大数阶乘有异曲同工之处

[解决办法]
探讨
111010100111001
= 1*2^14 + 1*2^13 +....+ 这有什么难的

读书人网 >软件架构设计

热点推荐