阅读背景:

大整数乘法-----------分治

来源:互联网 

前几天看到了大整数加法的算法,觉得十分有趣,遂决定自己写一个大证书乘法,代码如下!

#include <stdio.h> #include <string.h> #define size 200 void mod(int sum[],int i) //进位 { if(sum[i]>=10) { sum[i+1]+=(sum[i]/10); sum[i]%=10; } } void mod_2(int (*s)[420],int i,int j) //作用等同于上面的函数的作用,可舍弃 { if(s[i][j]>=10) { (s[i][j+1])+=(s[i][j]/10); s[i][j]%=10; mod_2(s,i,j+1); } } int main() { int a[size+10],b[size+10]; int s[size+10][2*size+20],sum[2*size+20]; char c[size+10],d[size+10]; int i,j=0,k,flag=0,temp=0; int length1,length2; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(sum,0,sizeof(sum)); memset(s,0,sizeof(s)); printf("请输入整数a:"); scanf("%s",c); printf("请输入整数b:"); scanf("%s",d); length1=strlen(c); length2=strlen(d); for(i=length1-1;i>=0;i--) a[j++]=c[i]-'0'; j=0; for(i=length2-1;i>=0;i--) b[j++]=d[i]-'0'; for(i=0;i<size+10;i++) { k=temp; for(j=0;j<size+10;j++) { s[i][k++]=s[i][k-1]+a[i]*b[j]; //产生的进位不能忽略 mod_2(s,i,k-1); } temp++; } for(i=0;i<size+10;i++) { flag=0; for(j=2*size+20-1;j>=0;j--) { if(flag) printf("%d",s[i][j]); else if(s[i][j]) { printf("%d",s[i][j]); flag=1; } } if(flag) printf("\n"); } for(i=0;i<2*size+10;i++) { for(j=0;j<size+10;j++) { sum[i]+=s[j][i]; if(sum[i]>=10) mod(sum,i); } } printf("两个大整数的积为:\n"); printf("\n\n"); flag=0; for(i=2*size+20-1;i>=0;i--) //控制打印的结果,去除先导0 { if(flag) printf("%d",sum[i]); else if(sum[i]) { printf("%d",sum[i]); flag=1; } } return 0; } #include



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: