算法分析与设计----大整数乘法代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
int main()
{
char a[100],b[100],s[202];
int n,i,j,g,t=0,k=1,temp;
scanf("%d",&n);
n--;
scanf("%s%s",&a,&b);
while(k<=2*n)
{
s[k]=0;
temp=0;
for(i=0;i<=n;i++)
{
for(j=0;j<=n;j++)
{
if((i+j)==k-1)
temp+=(a[n-i]-48)*(b[n-j]-48);
}
}
g=(temp+t)%10;
t=(temp+t)/10;
s[k]=g;
k++;
}
temp=0;
for(i=0;i<=n;i++)
{
for(j=0;j<=n;j++)
if((i+j)==k-1)
temp+=(a[n-i]-48)*(b[n-j]-48);
}
temp+=t;
printf("%d",temp);
for(i=2*n;i>0;i--)
printf("%d",s[i]);
printf("\n");
return 0;
}
//两个100位以内的如果小了自己将数组改一下
设X和Y是两个n位的整数,假定n是2的整数次幂。把每个整数分为两部分,每部分为n/2位,则X和Y可重写为X=x1*10n/2+x0和Y=y1*10n/2+y0,X和Y的乘积可以计算为
X*Y= (x1*10n/2+x0)*( y1*10n/2+y0)
= X1*Y1*10n+(( x1+x0)*( y1+y0)-x1*y1-x0*y0)* 10n/2+ x0*y0
由此体现了分治递归的思想,将大整数化小,规模也变小。
源代码如下:
#include
#include
int n,x,y,rt;//全局变量
void input()
{
cout<<"两个乘数的位数是n,请输入n的值(n是2的整数次幂): "; cin>>n;
cout< cout<<"x="; cin>>x; cout<<"y="; cin>>y; } int calculate(int a,int b) //计算数值函数--循环体 int temp1,temp2; long s; int x1,x0,y1,y0; if(n>1) //可以分治算法的条件 { temp1=(int)pow(10,n/2); temp2=(int)pow(10,n); x1=a/temp1; //x值的前半部分 x0=a-x1*temp1; //x值的后半部分 y1=b/temp1;//y值的前半部分 y0=b-y1*temp1;//y值的后半部分 n=n/2; //经过一次分治后,数的位数减半 s=calculate(x1,y1)*temp2+(calculate(x1+x0,y1+y0)-calculate(x1,y1)-calc ulate(x0,y0))*temp1+calculate(x0,y0); } else return a*b; return s; } void print()//输出函数 { cout<<"乘数x="< } void main()//主函数 { char c; do{ system("cls");//清屏函数 input(); rt=calculate(x,y); print(); cout<<"是否继续?(y/n)"< cin>>c; }while(c=='y'||'c'=='Y'); }