问题:

  两个大数相乘,无法用计算机中现有的类型直接进行操作,因为表示范围有限。两个大数是通过字符串表示的。

解决思路:

  将输入的字符串转换成char数组,在转成int数组,采用分治思想,每一位进行相乘。

公式:

  AB*CD = AC(BC+AD)BD ,然后从后到前满10进位。

  摆放成另一种形式就看的清楚了:

    A              B 

                  *

    C              D

  =     AC   BC    BD

          AD

这个乘法的形式其实就是模拟手工做乘法的过程。乘完了之后BC和AD处于同等的地位,是相加的关系。

 

例:

  67*89 = 6*8(7*8 + 6*9)7*9  

  67*89 = 48(110)63

从后到前满10进位:

  63进6剩余3,110变成116,满十进位,进行11,剩余6,48变成59。所以结果: 5963

 

代码:

 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4 
 5 string multiply(string num1, string num2)
 6 {
 7     int size1 = num1.size();
 8     int size2 = num2.size();
 9     
10     if(size1 < 1 || size2 < 1)
11         return "";
12     
13     int *result = new int[size1 + size2];
14     int *n1 = new int[size1];
15     int *n2 = new int[size2];
16     
17     for(int i = 0; i < size1; i++)
18     {
19         n1[i] = num1[i] - '0';
20     }
21     
22     for(int i = 0; i < size2; i++)
23     {
24         n2[i] = num2[i] - '0';
25     }
26     
27     for(int i = 0; i < size1; i++)
28     {
29         for(int j = 0; j < size2; j++)
30         {
31             result[i+j] += n1[i] * n2[j];
32         }
33     }
34     
35     for(int i = size1 + size2 - 1; i > 0; i--)
36     {
37         result[i - 1] += result[i] / 10;
38         result[i] = result[i] % 10;
39     }
40     
41     string ret = "";
42     for(int i = 0; i < size1 + size2 - 1; i++)
43     {
44         ret += to_string(result[i]);
45     }
46     
47     return ret;
48 }
49 
50 int main()
51 {
52     string ret = multiply("67", "89");
53     std::cout << "result : " << ret << std::endl;
54     
55     return 0;
56 }

运行结果:

 

 

 

posted on 2020-08-12 20:37  周伯通789  阅读(214)  评论(0编辑  收藏  举报