大整数乘法实验代码(最新版)-蔡强
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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);