算法分析与设计----大整数乘法代码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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="<

input();

rt=calculate(x,y);

print();

cout<<"是否继续?(y/n)"<

cin>>c;

}while(c=='y'||'c'=='Y');

}

相关文档
最新文档