#include <stdio.h>
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<math.h>
#include<stdlib.h>
int n,x,y,rt;//全局变量
void input()
{
cout<<"两个乘数的位数是n,请输入n的值(n是2的整数次幂): "; cin>>n;
cout<<endl<<"请输入两个乘数的值:"<<endl;
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="<<x<<"\t"<<"y="<<y<<endl; cout<<"结果rt="<<rt<<endl;
}
void main()//主函数
{
char c;
do{
system("cls");//清屏函数
input();
rt=calculate(x,y);
print();
cout<<"是否继续?(y/n)"<<endl;
cin>>c;
}while(c=='y'||'c'=='Y');
}。