高精度乘法

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

 

posted @ 2018-01-14 22:10  Do1phln  阅读(222)  评论(0编辑  收藏  举报