poj2389 大数相乘

链接:http://poj.org/problem?id=2389

 

模板题,不多说。

 

现以 835×49为例来说明程序的计算过程。

先算835×9。5×9得到45个1,3×9得到27个10,8×9得到72个100。由于不急于处理进位,所以835×9算完后,aResult如下: 



接下来算4×5。此处4×5的结果代表20个10,因此要 aResult[1]+=20,变为:
 
 
 
乘法过程完毕。接下来从 aResult[0]开始向高位逐位处理进位问题。aResult[0]留下5,把4加到aResult[1]上,aResult[1]变为51后,应留下1,把5加到aResult[2]上……最终使得aResult里的每个元素都是1位数,结果就算出来了:
 
#include<stdio.h>
#include<string.h>


int main()
{
	int i,j,nb,na,d;
	int alen,blen,numa[50],numb[50];
	int a[50],b[50],res[100];
	char line1[50],line2[50],result[100];

	while(scanf("%s%s",line1,line2)>0)
	{
		alen=strlen(line1);
		blen=strlen(line2);
		memset(res,0,sizeof(res));

		for(i=alen-1,na=0;i>=0;i--)
			numa[na++]=line1[i]-'0';
		for(i=blen-1,nb=0;i>=0;i--)
			numb[nb++]=line2[i]-'0';
		for(i=0;i<na;i++)
			for(j=0;j<nb;j++)
				res[i+j]+=(numa[i]*numb[j]);

		na=na+nb+10;
		for(i=0,d=0;i<=na;i++)
		{
			if(res[i]>=10)
				res[i+1]+=(res[i]/10);
			res[i]%=10;
			if(res[i]!=0)
				d=i;             //记录输出的开始位置,即最高位数
		}

		for(i=d;i>=0;i--)
			printf("%d",res[i]);
		printf("\n");
	}
	return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值