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

//九度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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值