大整数乘法

1.引言

用计算机实现两个比较小的数相乘不是一件难事,但是当两个数很大,比如11111987654321和55443322111相乘,由于计算机的精度是有限的,所以用编程语言提供的原子数据类型来直接完成这两个大数的乘法显然不切实际。

2.运用数组

运用两个数组分别存储两个大数的每一位,这样首先解决了大数的存储问题,然后按照乘法的基本规则对这两个大数进行运算即可,下面通过程序一步一步解释。

 

 1 /************************************************
 2 
 3 Copyright:1.0
 4 
 5 Author: 太白路上的小混混
 6 
 7 Date:2014-12-4
 8 
 9 Description:Implement multiplication of two large 
10             numbers
11 
12 *************************************************/
13 #include <iostream>
14 using namespace std;
15 
16 /*************************************************
17 Function:       multi
18 Description:    Implement multiplication of two 
19                 large numbers
20 Input:          Two large numbers stored in two 
21                 arrays respectly;
22                 The sizes of the two arrays.
23 Output:         A array storing the product of 
24                 the two large numbers
25 *************************************************/
26 int* multi(int* firstNumber, const unsigned firstSize, int* secondNumber, const unsigned secondSize)
27 {
28     //建立一个足够大的矩阵来保存乘积结果的每一位
29     const unsigned  sz = firstSize + secondSize;
30     int* result = new int[sz];
31     for (unsigned i = 0; i < sz; ++i)
32     {
33         result[i] = 0;
34     }
35 
36     //利用乘法规则,用第二个数的每一位去乘以第一个
37     //数的每一位.先不考虑进位
38     for (unsigned i = 0; i < secondSize; ++i)
39     {
40         unsigned k = i;
41         for (unsigned j = 0; j < firstSize; ++j)
42         {
43             result[k++] += secondNumber[i] * firstNumber[j];
44         }
45     }
46     //在上面一步操作结束之后,对每一位进行进位检查,如果某位大于10,
47     //根据具体大小向前一位进位
48     for (unsigned i = 0; i < sz; ++i)
49     {
50         if (result[i] >= 10)
51         {
52             result[i+1] += result[i] / 10;
53             result[i] %= 10;
54         }
55     }
56     return result;
57 }
58 
59 int main()
60 {
61     //数组存储数据的方式是低位在前,高位在后,所以下面两个数
62     //分别是11111123456789和55444333222111
63     int firstNumber[] = {1,2,3,4,5,6,7,8,9,1,1,1,1,1};
64     int secondNumber[] = {1,1,1,2,2,2,3,3,3,4,4,4,5,5};
65     int* result = multi(firstNumber, 14, secondNumber, 14);
66 
67     //逐位输出
68     for (int i = 27; i >= 0; i--)
69     {
70         cout << result[i];
71     }
72     delete[] result;
73     return 0;
74 }

运行结果:

3.总结

这是用数组这种结构解决问题的一个典型例子

调试开始的时候第66行:

for (unsigned i = 27; i >= 0; i--)

这样会使得程序陷入无限循环,因为当 无符号 i 为0之后,继续减 1 会变成一个无限大的另一个无符号正数,这也暴露了数组这种结构不检查边界的缺陷,编程过程中程序员自己需要保证边界的正确性!



原文地址:https://www.cnblogs.com/90zeng/p/large_number.html