字符串相乘(竖式模拟)
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
示例 1:
输入: num1 = “2”, num2 = “3”
输出: “6”
示例 2:
输入: num1 = “123”, num2 = “456”
输出: “56088”
1 2 3 4
| num1 和 num2 的长度小于110。 num1 和 num2 只包含数字 0-9。 num1 和 num2 均不以零开头,除非是数字 0 本身。 不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。
|
算法思想
从小学的竖式计算中获得启发,从最低位开始计算。
最开始不考虑进位,最后统一进行进位。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| string multiply(string num1, string num2){ if(num1 == '0' || num2 == '0') return "0"; int n1 = num1.size(), n2 = num2.size(); reverse(num1.begin, num1.end()); reverse(num2.begin, num2.end()); int ans[225] = {0}; for(int i = 0; i < n1; ++i){ for (int j = 0; j < n2; ++i){ ans[i+j] += (num1[i] - '0')*(num2[i] - '0'); } } for (int i = 0; i < n1+n2; ++i){ if(ans[i] > 9){ int tmp = ans[i]%9; ans[i+1] += ans[i]/10; ans[i] = tmp; } } int i = 0; string output = ""; while(ans[i] == 0){ i--; } while(i >= 0){ output += to_string(ans[i]); } return ans; }
|
小结
在遇到计算机无法直接处理的大数时,一般需要联想到人工的做法进行模拟;
This is copyright.