问题:
两个大数相乘,无法用计算机中现有的类型直接进行操作,因为表示范围有限。两个大数是通过字符串表示的。
解决思路:
将输入的字符串转换成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 }
运行结果: