高精度计算(三) /*高精度的乘法运算*/

 高精度乘单精度

求 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;
}

  

posted @ 2016-11-01 13:17  sinEagle  阅读(2764)  评论(0编辑  收藏  举报