前不久参加达内的“发现杯”碰到这么个题目,计算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;
}
将运行的结果和计算器得出的结果做下比价,即检验程序。