计算12345678901×98765432101的积

前不久参加达内的“发现杯”碰到这么个题目,计算12345678901×98765432101的积

赛场没有理清思路,赛后恍悟……
大数相乘算法,从积的位数出发来思考
比如:积的个位=数1的个位×数2的个位;
 积的十位=数1的个位×数2的十位+数1的十位×数2的个位;
 积的百位=数1的个位×数2的百位+数1的十位×数2的十位+数1的百位×数2的个位;
 ...........
最后当然还要给积的每一位进行求余运算,做进位工作

#include "stdafx.h"
#include <stdio.h>
int main(int argc, char* argv[])
{
	int one[11],two[11];
	one[0]=two[0]=1;
	one[1]=two[1]=0;
	int x,z;
	for(x=2;x<11;x++)
	{
		one[x]=11-x;
		two[x]=x-1;
	}
	
	int three[22]={0,};
	for (z=0;z<22;z++)
	{
		for (x=0;x<11&&x<=z;x++)
		{
			if (z-x<11)
			{
				three[z]+=one[x]*two[z-x];
			}
			
		}
	}
	for (z=0;z<22;z++)
	{
		if (three[z]>=10)
		{
			three[z+1]+=three[z]/10;
			three[z]=three[z]%10;
		}
	}
	if (three[21]!=0)
	{
		for (z=21;z>=0;z--)
		{
			printf("%d",three[z]);
		}
	}
	else
		for (z=20;z>=0;z--)
		{
			printf("%d",three[z]);
		}
	return 0;
}

将运行的结果和计算器得出的结果做下比价,即检验程序。












评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值