高精度計算(三) /*高精度的乘法運算*/


 高精度乘單精度

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

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM