問題:兩個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