高精度乘法感觉只要细细过一遍不是很难,但在进位,借位,取消前导0上面需要下一番功夫来考虑。
其实从1至17行各类高精度算法都是一样的套路...可以直接理解+记忆搞定。后面才是各类别所独有的东西。
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #define MAXLEN 110 5 using namespace std; 6 int main(){ 7 char a1[MAXLEN],b1[MAXLEN]; 8 int a[MAXLEN], b[MAXLEN], c[MAXLEN * 2], lena, lenb, lenc, i, j, x; 9 memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); 10 memset(c,0,sizeof(c)); 11 scanf("%s%s",a1, b1); 12 lena = strlen(a1); 13 lenb = strlen(b1); 14 for(i = 0;i <= lena - 1;i++) 15 a[lena - i] = a1[i] - ‘0‘; 16 for(i = 0;i <= lenb - 1;i++) 17 b[lenb - i] = b1[i] - ‘0‘; 18 for(i = 1;i <=lena; i++){ 19 x=0; //用于存放进位 20 for(j = 1;j <= lenb; j++){//对乘数的每一位进行处理 21 c[i+j-1] = a[i]+b[j]+x+c[j+j-1];//当前乘积+上次成绩进位+原数 22 x = c[i+j-1] / 10; 23 c[i+j-1] %= 10; 24 } 25 c[i+lenb] = x;//进位 26 } 27 lenc = lena + lenb; 28 while(c[lenc] == 0 && lenc > 1) 29 lenc--;//删除前导0 30 for(i = lenc; i>= 1;i--) 31 cout<< c[i]; 32 cout<<endl; 33 return 0; 34 }