高精度计算(三) /*高精度的乘法运算*/
高精度乘单精度
求 a=a*b。( 0<a<10250, 0<b<108)
输入:
第一行:a
第二行:b
输出:
a*b 的值。
样例输入:
330
100
样例输出:
33000
分析:
1)a 的每一位都单独与 b 相乘;
2)再由低到高位依次处理 a 的进位;
3)最后处理最高位。
程序实现:
1 //高精度乘单精度
2 #include <iostream>
3 #include <cstring>
4 using namespace std;
5
6 char s1[300], s2[300];
7 int a[300];
8
9 int main()
10 {
11 int la, b, m;
12 cin >> s1 >> b;
13 la = strlen(s1);
14 for(int i=1;i<=la;i++)
15 a[i] = s1[la-i] - 48;
16 for(int i=1;i<=la;i++)
17 a[i] = a[i] * b;
18 for(int i=1;i<=la;i++)
19 {
20 a[i+1] += a[i] / 10;
21 a[i] = a[i] % 10;
22 }
23 m = a[la+1];
24 while(m>0)
25 {
26 a[++la] = m % 10;
27 m = m/10;
28 }
29 for(int i=la;i>=1;i--)
30 cout << a[i];
31
32 return 0;
33 }
34
例 2.6.4 高精度乘高精度
求 c=a*b(0<a<10250, 0<b<10250)
输入:
第一行:a
第二行:b
输出:a-b 的值。
样例输入:
22222
33333
样例输出:
740725926
分析:
假设乘数和被乘数的长度分别为 la 和 lb,则最后的乘积长度最长为 la+lb,最短为 la+lb-1;
程序实现:边乘边处理进位
#include <iostream> #include <cstring> using namespace std; int a[300], b[300], c[300]; char s1[300], s2[300], s3[300]; int main() { cin >> s1 >> s2; int la, lb, len; la = strlen(s1); lb = strlen(s2); for(int i=1;i<=la;i++) a[i] = s1[la-i] - 48; for(int i=1;i<=lb;i++) b[i] = s2[lb-i] - 48; for(int i=1;i<=la;i++)//a[i]*b[j]的结果存放在 c[i+j-1] for(int j=1;j<=lb;j++) { c[i+j-1] = c[i+j-1] + a[i] * b[j]; c[i+j] = c[i+j] + c[i+j-1]/10; c[i+j-1] = c[i+j-1] % 10; } len = la + lb; while(c[len]==0 && len>1) len--; //去掉多余的前导 0; for(int i=len;i>=1;i--) cout << c[i]; return 0; }