//九度OJ教程65 大数处理之清华机试题 十进制VS二进制。

来源:互联网 发布:仁和知柏地黄丸 编辑:程序博客网 时间:2024/04/30 22:00
//九度OJ教程65  大数处理之清华机试题 十进制VS二进制。//http://ac.jobdu.com/problem.php?cid=1040&pid=64//本来是想预处理的,吧权值全部放在数组 BIGNUM quan[MAXS]中。结果无限空间超过……没办法,运行一次求一次权吧……#include <stdio.h>#include <string.h>#define MAXS 3300typedef struct BIGNUM{int num[MAXS];int l;}BIGNUM;BIGNUM quan;//num[]是该位的权值,l是权值的位数。BIGNUM add(BIGNUM a,BIGNUM b){int i;if(a.l<b.l)//让a的l值永远比b的大{BIGNUM temp=a;a=b;b=temp;}for(i=0;i<=b.l;i++)a.num[i]+=b.num[i];for(i=0;i<a.l;i++){a.num[i+1]+=a.num[i]/10;a.num[i]%=10;}if(a.num[a.l]>=10){a.num[a.l+1]=a.num[a.l]/10;a.num[a.l]%=10;a.l++;}return a;}BIGNUM zzquan(BIGNUM quan){int i,l;BIGNUM temp=quan;for(i=0;i<=temp.l;i++)quan.num[i]=temp.num[i]+temp.num[i];for(i=0;i<temp.l;i++){quan.num[i+1]+=quan.num[i]/10;quan.num[i]%=10;}if(quan.num[i]>=10){l=quan.l=i+1;quan.num[l]=quan.num[i]/10;quan.num[i]%=10;}else quan.l=i;return quan;}int main(){BIGNUM ans;int stack[MAXS],a[MAXS],t,l,i,j;char h[MAXS];quan.l=0;quan.num[0]=1;while(~scanf("%s",h)){for(i=0;i<MAXS;i++)a[i]=ans.num[i]=quan.num[i]=0;t=ans.l=quan.l=0;quan.num[0]=1;l=strlen(h)-1;if(!l&&h[0]=='0'){printf("0\n");continue;}for(i=0;i<=l;i++)a[i]=h[l-i]-'0';while(l)//十位往上不空时{for(i=l;i;i--)//略过个位处理。个位的余数要进栈的。{a[i-1]+=(a[i]&1)*10;a[i]>>=1;}stack[t++]=a[0]&1;a[0]>>=1;for(;!a[l];l--);}while(a[0])//个位不是0的话{stack[t++]=a[0]&1;a[0]>>=1;}for(i=0,j=t-1;i<j;i++,j--){int temp=stack[i];stack[i]=stack[j];stack[j]=temp;}for(i=0;i<t;i++){if(stack[i])ans=add(ans,quan);quan=zzquan(quan);}for(i=ans.l;i>=0;i--)printf("%d",ans.num[i]);printf("\n");}return 0;}

原创粉丝点击