大数相乘 C++实现

12*34=?
乘数:12
被乘数:34


先把乘数列出来,第i行列左起第i位数,列N次(N为乘数的位数)
第二行起每次右移一位
(1) (1)
    (2) (2)

写入被乘数,按先列后行的方式
(1,3) (1,4)
      (2,3) (2,4)

将()内的数两乘
(1,3=3) (1,4=4)
        (2,3=6) (2,4=8)

相加,注意进位
(1,3=3) (1,4=4)
        (2,3=6) (2,4=8)
-------------------------
     3      10       8
         .          
-------------------------
     4       0       8

12*34=408

再看三位数乘法

123*456=?

第一步:
(1) (1) (1)
    (2) (2) (2)
        (3) (3) (3) 

第二步:
(1,4) (1,5) (1,6)
      (2,4) (2,5) (2,6)
            (3,4) (3,5) (3,6)

第三步:
(1,4= 4) (1,5= 5) (1,6= 6)
         (2,4= 8) (2,5=10) (2,6=12)
                  (3,4=12) (3,5=15) (3,6=18)

第四步:
(1,4= 4) (1,5= 5) (1,6= 6)
         (2,4= 8) (2,5=10) (2,6=12)
                  (3,4=12) (3,5=15) (3,6=18)
----------------------------------------------
      4       13       28       27       18
           .        .        .        .
----------------------------------------------
      5        6        0        8        8

123*456=56088

    分析一下每一位的值是如何计算出来的,以下说的位都是从个位算起:
结果的第i位,是乘数的第i位乘以被乘数的1位,再加上乘数的第i-1位乘
以被乘数的第2位,一起加到乘数的第1位乘以被乘数的第i位。这样描述起
来有点不明白,画个图就很清楚了:
123*456的第3位:从乘数的第3位(1)起到第1位(3),按从右向左的方式
逐个乘以被乘数:
1*6+2*5+3*4=28

再把进位加上就可以了。
到这里,已经可以得出一个通用的计算方法,把结果逐位计算出来。

   通过上面的分析,我们知道了算法的核心思想,接下来就能把算法实现,实现方法如下:

[cpp]  view plain  copy
  1. #include "iostream"  
  2.   
  3. using namespace std;  
  4. #define N 100  
  5.   
  6. void char_to_int(int *a , char* ch){  
  7.     int len = strlen(ch);  
  8.     int i = 0, term = 0;  
  9.     for(i = 0 ; i < N ; i++){  
  10.         a[i] = 0;  
  11.     }  
  12.   
  13.     for(i = 0 ; i < len ; i++){  
  14.         term = ch[i];  
  15.         a[len-i-1] = (term - '0');  
  16.   
  17.     }  
  18. }   
  19.   
  20. int main()  
  21. {  
  22.     int a[N],b[N],c[2*N];  
  23.     char ch1[N], ch2[N];  
  24.     int i = 0 , j =0;  
  25.     cout<<"1:";  
  26.     cin>>ch1;  
  27.     cout<<"2:";  
  28.     cin>>ch2;  
  29.     char_to_int(a , ch1);  
  30.     char_to_int(b , ch2);  
  31.       
  32.     for(i = 0 ; i < 2*N ; ++i){  
  33.         c[i] = 0;  
  34.     }  
  35.     for(i = 0 ; i < N ; ++i){  
  36.         for(j = 0 ; j < N ; ++j){  
  37.             c[i+j] += a[i] * b[j];  
  38.         }  
  39.     }  
  40.     for(i = 0 ; i < 2*N -1 ; ++i){  
  41.         c[i+1] += c[i] /10;  
  42.         c[i] = c[i] % 10;  
  43.     }  
  44.     j = 2*N -1;  
  45.   
  46.     while(c[j] == 0)    
  47.                j--;    
  48.     for(i = j;i >= 0; --i)    
  49.            printf("%d",c[i]);    
  50.     printf("\n");    
  51.     return 0;    
  52. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值