模仿笔算乘法代码如下:
网友的作法如下:
#include<stdio.h>
#include<stdlib.h>
#include"string.h"
#define len 20
int main()
{
int i,j,t,n,temp;
char mult1[len];
char mult2[len];
printf("Input two big numbers:\n");
scanf("%s %s",mult1,mult2);
int len1 = strlen(mult1);
int len2 = strlen(mult2);
int *c1 = (int *)malloc(sizeof(int)*len1);
int *c2 = (int *)malloc(sizeof(int)*len2);
for(i=0; i<len1; i++)
c1[i]=(int)mult1[i]-48;//将字符数字转化为数字。1的ASCII为48
for(i=0; i<len2; i++)
c2[i]=(int)mult2[i]-48;
int *result = (int *)malloc(sizeof(int)*(len1+len2));//长度len1、len2两数字相乘,结果长度不超过len1=len2.如999*999=998001
n=len1+len2-1;
for(i=0; i<=n; i++)
result[i]=0; //结果的每一位初始值均为零
temp=0;
for(i=len2-1; i>-1; i--)
{
t=c2[i];
for(j=len1-1; j>-1 ;j--)
{
if((temp=result[n]+t*c1[j])>=10)//乘数的一位与被乘数一位相乘有进位
{
result[n]=(temp)%10;//保存乘数的一位与被乘数相乘的结果
result[n-1]+=temp/10;//将上次求得的进位保存到result[n-1]
}
else//乘数的一位与被乘数一位相乘无进位
result[n]=temp;
n--;
}
n=n+len1-1;//一轮乘法结束,模仿笔算乘法把下一轮乘法的结果数左移一位
}
printf("Result: ");
if(result[0]!=0)//去掉数字前面的零
printf("%d",result[0]);
for(i=1;i<=len1+len2-1;i++)
printf("%d",result[i]);
printf("\n");
return 0;
}
分治法
算法分析与设计 王晓东 P29
网友代码如下;
/*设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) = X*Y*10n+(( x1+x0)*( y1+y0)-x1*y1-x0*y0)* 10n/2+ x0*y0
由此体现了分治递归的思想,将大整数化小,规模也变小。
*/
using namespace std;
#include<math.h>
#include<stdlib.h>
#include <iostream>
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)-calculate(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;
}
int main()//主函数
{
char c;
input();
rt=calculate(x,y);
print();
return 0;
}