//九度OJ教程65 大数处理之清华机试题 十进制VS二进制。
//http://ac.jobdu.com/problem.php?cid=1040&pid=64
//本来是想预处理的,吧权值全部放在数组 BIGNUM quan[MAXS]中。结果无限空间超过……没办法,运行一次求一次权吧……
#include <stdio.h>
#include <string.h>
#define MAXS 3300
typedef 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;
}
//九度OJ教程65 大数处理之清华机试题 十进制VS二进制。
最新推荐文章于 2021-05-17 18:02:10 发布