您的位置:首页 > 编程语言 > C语言/C++

Multiply Strings(大整数乘法)

2017-11-12 01:50 106 查看

题目

Given two non-negative integers
num1
and
num2
represented as strings, return the product of
num1
and
num2
.

Note:

The length of both
num1
and
num2
is < 110.
Both
num1
and
num2
contains only digits
0-9
.
Both
num1
and
num2
does 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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  LeetCode C++