高精度乘法感觉只要细细过一遍不是很难,但在进位,借位,取消前导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 }