Multiply Strings(大整数乘法)
2017-11-12 01:50
106 查看
题目
Given two non-negative integersnum1and
num2represented as strings, return the product of
num1and
num2.
Note:
The length of both
num1and
num2is < 110.
Both
num1and
num2contains only digits
0-9.
Both
num1and
num2does not contain any leading zero.
You must not use any built-in BigInteger library or
convert the inputs to integer directly.
分析
1. 题目要求
给出两个 string 类型的整数,这两个整数长度都小于 110,这两个整数的每一位仅仅由 0-9 构成,并且当整数的位数大于1时,不以0开头。要求我们不使用已经有的大整数库。其实就是大整数的乘法。
2. 求解方法
一般对于大整数的乘法(加法/减法/除法),都是使用模拟手工计算的方法。首先,新建3个 int 类型的数组,两个数组分别存储两个整数的每一位,第3个数组每一位都置为0。
然后将对应的位相乘,将得到的结果存在第3个数组的对应位置上。
for (int j = num2.length() - 1; j >= 0; j--) { t = k; for (int i = num1.length() - 1; i >= 0; i--) { arr3[t] += arr1[i] * arr2[j]; t++; } k++; }其中 数组 arr1 和 arr2 的下标较小的存储整数较高的位,例如,对于整数 123 存储在数组中为 {1, 2, 3}。结果数组下标较小的位置存储结果较低的位。
此时,得到的结果并没有进位。从低位到高位依次处理进位。
for (int i = 0; i < dig - 1; i++) { arr3[i+1] += (arr3[i] / 10); arr3[i] %= 10; }最后,将得到的结果转化为 string 类型的字符串。
3. 代码如下
class Solution {
public:
string multiply(string num1, string num2) {
if (num1 == "0" ||
4000
num2 == "0") return "0";
int arr1[num1.length()];
int arr2[num2.length()];
int arr3[num1.length() + num2.length()];
int k = 0, t = 0, dig = num1.length() + num2.length();
char temp = '0';
string res = ""; // 结果
// 以下两个 for 循环将两个 string 分别存在 两个数组中,第三个数组全部置 0
for (int i = 0; i < num1.length(); i++) {
arr1[i] = num1[i] - '0';
arr3[i] = 0;
}
for (int i = 0; i < num2.length(); i++) {
arr2[i] = num2[i] - '0';
arr3[i + num1.length()] = 0;
}
for (int j = num2.length() - 1; j >= 0; j--) { t = k; for (int i = num1.length() - 1; i >= 0; i--) { arr3[t] += arr1[i] * arr2[j]; t++; } k++; }
for (int i = 0; i < dig - 1; i++) { arr3[i+1] += (arr3[i] / 10); arr3[i] %= 10; }
if (arr3[dig - 1] == 0) {
dig--;
}
for (int i = dig - 1; i >= 0; i--) {
res.append(1, arr3[i] + '0');
}
return res;
}
};
相关文章推荐
- 大整数乘法python3实现
- 大整数乘法
- 分治法解决大整数乘法
- 递归分治-大整数乘法
- 大整数乘法
- 大整数算法[13] 单数位乘法
- 有正负号的大整数的乘法
- 一道面试题(C#实现了超大整数的加减乘法运算)
- 关于大整数的乘法的算法时间复杂度的计算过程推导(纯属个人推测,请高人指正)
- 9.7数学与概率(二)——实现整数的乘法、减法和除法运算,只允许使用加号
- 大整数乘法算法
- VC++大数乘法计算,支持1000位大整数乘法运算
- 大整数乘法
- 整数乘法---FFT 的递归实现
- LeetCode-Multiply Strings-字符串乘法-大整数-字符串操作
- 大整数乘法
- 分治法 --- 大整数的乘法
- 【原】 POJ 1001 Exponentiation 大整数乘法 解题报告
- HDU 1402 POJ 2389 BZOJ 2179 大整数乘法 FFT
- 整数高精度运算的库(加法,减法,乘法,除法,取模)