字符串相乘
题目
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
示例 1:
输入: num1 = “2”, num2 = “3”
输出: “6”
示例 2:
输入: num1 = “123”, num2 = “456”
输出: “56088”
说明:
num1 和 num2 的长度小于110。
num1 和 num2 只包含数字 0-9。
num1 和 num2 均不以零开头,除非是数字 0 本身。
不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。
解决方法
详见博客JustDoIT
详细代码
//
// Created by HINTS on 2018/12/5.
//
#include <iostream>
#include <string>
#include <cmath>
#include <vector>
using namespace std;
/* 超出范围
int strtoi(string s){
int i = 0;
for (int j = 0; j < s.size(); ++j) {
i = i * 10 + (s[j] - '0');
}
return i;
}
string multiply(string s1, string s2){
int i2 = strtoi(s2);
int s1_len = s1.size();
int result = 0;
for (int i = 0; i < s1_len; ++i) {
result = (s1[i]-'0')*pow(10,s1_len - i - 1)*i2 + result;
}
return to_string(result);
}
*/
string multiply(string num1, string num2){
int n1 = num1.size(), n2 = num2.size();
vector<int> tmpres(n1 + n2, 0);
int k = n1 + n2 - 2;
//第一步:用一维数组记录没有进位的临时结果
//289*756:tmpres{72,109,119,66,14,0}
for (int i = 0; i < n1; ++i) {
for (int j = 0; j < n2; ++j) {
tmpres[k-i-j] += (num1[i]-'0')*(num2[j] - '0');
}
}
//第二步:处理进位
//72,109+7=116,
// 7, 11,
// 2, 6,
int carry = 0;
for (int i = 0; i < n1 + n2; ++i) {
tmpres[i] += carry;
carry = tmpres[i]/10;
tmpres[i] %= 10;
}
int i = k + 1;
while (tmpres[i] == 0) //去掉乘积的前导0
i--;
if(i < 0) //乘积为0的情况
return "0";
//第三步:因为tmpres中的数是倒着的,所以是需要通过循环倒过来,并转为字符串。
string result;
for (; i >= 0; i--) {
result.push_back(tmpres[i] + '0');
}
return result;
}
int main(){
string s1 = "289", s2 = "758";
cout<<multiply(s1,s2)<<endl;
return 0;
}