问题:两个100位以内的大数相乘
分析:模拟乘法累加法(虽然还有很多其他优秀算法,但是我认为这种是比较好理解且代码量不大的一种),用C语言实现的
参考:http://www.javashuo.com/article/p-wganfrjz-gk.html
代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> void mul(char *a,char *b) { int alen,blen,len,i,j,cf; int *s; alen=strlen(a); blen=strlen(b); cf=0; //进位标识 s=(int*)malloc(sizeof(int)*(alen+blen)); for(i=0; i<(alen+blen); i++) { s[i]=0; } for(i=alen-1; i>=0; i--) { for(j=blen-1; j>=0; j--) { s[(alen-1-i)+(blen-1-j)]=(a[i]-'0')*(b[j]-'0')+s[(alen-1-i)+(blen-1-j)]; } } for(i=0; i<=(alen+blen-1); i++) { s[i]=s[i]+cf; if(s[i]>=10) { cf=s[i]/10; s[i]=s[i]%10; } else { s[i]=s[i]; cf=0; } } len=0; //高位可以不输出的0尽量不输出 for(i=alen+blen-1;i>=0;i++) { if(s[i]==0) { len++; } else { break; } } len=alen+blen-1-len; for(i=len; i>=0; i--) { printf("%d",s[i]); } printf("\n"); } int main() { char n[101],m[101]; while((scanf("%s %s",n,m))!=EOF) { mul(n,m); } return 0; }
运行结果:
一小点想法:因为两个一位数相乘最大是81,然后如果有100位9与100位9相乘,那么最大的数字应该不超过81+81+16+98=276,是在int类型的范围类,所以保存结果的数组s定义成int类型应该是够用的。
关于C语言里的基本类型以及范围,可以看这个博客:https://blog.csdn.net/qq_16234613/article/details/77541722