当前位置:文档之家› 大整数乘法实验代码(最新版)-蔡强

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

姓名:蔡强学号:2012150269以下代码都在上的B48题测试过//普通大整数乘法代码#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <ctime>using namespace std;#define MAX 1000005char s1[MAX];char s2[MAX];char ans[MAX*2];void fanzhuan(char *s)//将字符串反转{int n=strlen(s);for(int i=0;i<n/2;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<t;p++){memset(s1,0,sizeof(s1));memset(s2,0,sizeof(s2));memset(ans,0,sizeof(ans));// printf("随机产生第一个数:");for(i=0;i<n;i++){s1[i]=rand()%10+'0';// printf("%c",s1[i]);}// printf("\n");// printf("随机产生第二个数:");for(i=0;i<n;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<x1+x2;i++)•ans[i]='0';//结果数组,初始化为字符0•for(i=0;i<x1;i++)//依次取第一个大整数的第i位,逐位相乘{•for(j=i;j<x2+i;j++)//用第一个大整数的第i位乘以第二个大整数的每一位{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 <iostream>#include <cstdio>#include <cstdlib>#include <ctime>#include <cstring>using namespace std;int value[32];void createL(){for(int i=0;i<32;i++)value[i]=1<<i;}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);free(c1);free(c0);free(x);free(y);return ans;}void show(int *a,int n)//输出结果{int i;int d=0;int flag=0;for(i=n-1;i>=0;i--){d+=a[i];a[i]=d%10;d/=10;}for(d=0;d<n;d++)if(a[d]!=0){flag=1;break;}if(flag)for(;d<n;d++)printf("%d",a[d]);else printf("0");printf("\n");}int main()//主函数{int i,n,t,p;int *a,*b,*ans;clock_t start,end;createL();printf("请输入测试数量:\n");scanf("%d",&p);printf("请输入数位长度:\n");scanf("%d",&t);n=Long(t);t=n-t;start=clock();while(p--){a=(int*)malloc(sizeof(int)*n);b=(int*)malloc(sizeof(int)*n);memset(a,0,sizeof(int)*n);memset(b,0,sizeof(int)*n);for(i=t;i<n;i++){a[i]=rand()%10;// printf("%d",a[i]);}// printf("\n");for(i=t;i<n;i++){b[i]=rand()%10;// printf("%d",b[i]);}//printf("\n");ans=mul(a,b,n);//show(ans,2*n);free(ans);free(a);free(b);}end=clock();printf("总的运行时间:\n");printf("%.6lf秒\n",(end-start)/1000.0);return 0;}//改进后的分治法#include <iostream>#include <cstdio>#include <cstdlib>#include <ctime>#include <cstring>using namespace std;int value[31];void createL(){for(int i=0;i<31;i++)value[i]=1<<i;}int Long(int n)//将整数补为2的n次方长度{int i;for(i=0;i<31;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 n)//减法(有改动){int d=0;n--;for(;n>=0;n--){if(a[n]+d<b[n]){a[n]=a[n]+d+10-b[n];d=-1;}else{a[n]=a[n]+d-b[n];d=0;}}}void sum2(int*a,int*b,int n)//加法{n--;for(;n>=0;n--)a[n]+=b[n];}void repair(int *a,int n)//修剪每部的中间结果(新增){int d=0;for(n--;n>=0;n--){d+=a[n];a[n]=d%10;d/=10;}a[0]+=d*10;}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<=16){int d=0,i,j;for(i=n-1;i>=0;i--){for(j=i+n;j>=i+1;j--){d=a[i]*b[j-i-1]+ans[j]+d;ans[j]=d%10;d/=10;}while(j>=0){d+=ans[j];ans[j--]=d%10;d/=10;}ans[0]+=d*10;d=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,n);red(c1,c0,n);sum2(ans,c2,n);sum2(ans+l,c1,n);sum2(ans+n,c0,n);repair(ans,2*n);free(c2);free(c1);free(c0);free(x);free(y);return ans;}void show(int *a,int n){int d=0;int flag=0;for(d=0;d<n;d++)if(a[d]!=0){flag=1;break;}if(flag)for(;d<n;d++)printf("%d",a[d]);else printf("0");printf("\n");}int main(){int i,n,t,p;int *a,*b,*ans;clock_t start,end;createL();printf("请输入测试数量:\n");scanf("%d",&p);printf("请输入数位长度:\n");scanf("%d",&t);n=Long(t);t=n-t;start=clock();while(p--){a=(int*)malloc(sizeof(int)*n);b=(int*)malloc(sizeof(int)*n);memset(a,0,sizeof(int)*n);memset(b,0,sizeof(int)*n);for(i=t;i<n;i++){a[i]=rand()%10;// printf("%d",a[i]);}// printf("\n");for(i=t;i<n;i++){b[i]=rand()%10;// printf("%d",b[i]);}// printf("\n");ans=mul(a,b,n);// show(ans,2*n);free(ans);free(a);free(b);}end=clock();printf("总的运行时间:\n");printf("%.6lf秒\n",(end-start)/1000.0);return 0;}。

相关主题