zoukankan      html  css  js  c++  java
  • 高精度计算(三) /*高精度的乘法运算*/

     高精度乘单精度

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

      

  • 相关阅读:
    UVALive 7141 BombX
    CodeForces 722D Generating Sets
    CodeForces 722C Destroying Array
    CodeForces 721D Maxim and Array
    CodeForces 721C Journey
    CodeForces 415D Mashmokh and ACM
    CodeForces 718C Sasha and Array
    CodeForces 635C XOR Equation
    CodeForces 631D Messenger
    田忌赛马问题
  • 原文地址:https://www.cnblogs.com/sineagle/p/6019086.html
Copyright © 2011-2022 走看看