大整数乘法实验代码(最新版)-蔡强

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

姓名:蔡强学号:2012150269

以下代码都在上的B48题测试过

//普通大整数乘法代码

#include

#include

#include

#include

#include

using namespace std;

#define MAX 1000005

char s1[MAX];

char s2[MAX];

char ans[MAX*2];

void fanzhuan(char *s)//将字符串反转

{

int n=strlen(s);

for(int i=0;i

{

char temp=s[i];

s[i]=s[n-i-1];

s[n-i-1]=temp;

}

}

int main()

{

int p,t,i,j,n;

char c;

clock_t s,e;

printf("请输入测试数量:\n");

scanf("%d",&t);

printf("请输入数位的长度:\n");

scanf("%d",&n);

c=getchar();

s=clock();

for(p=0;p

{

memset(s1,0,sizeof(s1));

memset(s2,0,sizeof(s2));

memset(ans,0,sizeof(ans));

// printf("随机产生第一个数:");

for(i=0;i

{

s1[i]=rand()%10+'0';

// printf("%c",s1[i]);

}

// printf("\n");

// printf("随机产生第二个数:");

for(i=0;i

{

s2[i]=rand()%10+'0';

// printf("%c",s2[i]);

}

// printf("\n");

int x1,x2;

x1=strlen(s1);

x2=strlen(s2);

fanzhuan(s1);

fanzhuan(s2);

int v,d=0;

for(i=0;i

•ans[i]='0';//结果数组,初始化为字符0

•for(i=0;i

{

•for(j=i;j

v=(s1[i]-'0')*(s2[j-i]-'0')+(ans[j]-'0')+d;

ans[j]=v%10+'0';

d=v/10;

}

while(d)//将剩下的余数向高位补齐,直到余数为0为止

{

ans[j++]=d%10+'0';

d/=10;

}

}

fanzhuan(ans);

for(i=0;ans[i]!='\0';i++)

if(ans[i]!='0')

break;

// printf("%s\n",ans+i);//输出结果

}

e=clock();

printf("总的运行时间:");

printf("%.6lf秒\n",(e-s)/1000.0);

return 0;

}

//未改进分治法

#include

#include

#include

#include

#include

using namespace std;

int value[32];

void createL()

{

for(int i=0;i<32;i++)

value[i]=1<

}

int Long(int n)//将整数补为2的n次方长度{

int i;

for(i=0;i<32;i++)

if(n<=value[i])

{

n=value[i];

return n;

}

return -1;

}

int *sum(int*a,int*b,int n)//加法

{

int *c=(int*)malloc(sizeof(int)*n);

n--;

for(;n>=0;n--)

c[n]=a[n]+b[n];

return c;

}

void red(int*a,int*b,int*c,int n)//减法{

n--;

for(;n>=0;n--)

a[n]=a[n]-b[n]-c[n];

}

void sum2(int*a,int*b,int n)//加法

{

n--;

for(;n>=0;n--)

a[n]+=b[n];

}

int *mul(int*a,int*b,int n)//递归乘法

{

int *ans=(int*)malloc(sizeof(int)*2*n);

memset(ans,0,sizeof(int)*n*2);

int *c2,*c1,*c0,*x,*y;

if(n<=1)

{

ans[1]=a[0]*b[0];

return ans;

}

int l=n/2;

c2=mul(a,b,l);

c0=mul(a+l,b+l,l);

x=sum(a,a+l,l);

y=sum(b,b+l,l);

c1=mul(x,y,l);

red(c1,c2,c0,n);

sum2(ans,c2,n);

sum2(ans+l,c1,n);

sum2(ans+n,c0,n);

free(c2);

相关文档
最新文档