高精度乘單精度
求 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;
}
