1. 题⽬链接:43.字符串相乘
2. 题⽬描述:
3. 解法(⽆进位相乘然后相加,最后处理进位):
算法思路:
整体思路就是模拟我们⼩学列竖式计算两个数相乘的过程。但是为了我们书写代码的⽅便性,我们选 择⼀种优化版本的,就是在计算两数相乘的时候,先不考虑进位,等到所有结果计算完毕之后,再去 考虑进位。
如下图:
C++算法代码:
class Solution
{
public:
string multiply(string num1, string num2)
{
//翻转
reverse(num1.begin(),num1.end());
reverse(num2.begin(),num2.end());
//不处理进位存储
int m=num1.size(),n=num2.size();
vector<int>temp(m+n,0);
for(int i=0;i<num2.size();i++)
{
for(int j=0;j<num1.size();j++)
{
temp[i+j]+=(num2[i]-'0')*(num1[j]-'0');
}
}
//处理进位
string answer;
int jinwei=0;
for(int i=0;i<m+n;i++)
{
answer+=to_string((temp[i]+jinwei)%10);
jinwei+=temp[i];
jinwei/=10;
}
// 处理前导零
//结果不为0,但尾部有0就尾删
while(answer.size() > 1 && answer.back() == '0')
{
answer.pop_back();
}
reverse(answer.begin(),answer.end());
return answer;
}
};
Java算法代码:
class Solution
{
public String multiply(String num1, String num2)
{
int m = num1.length(), n = num2.length();
char[] n1 = new StringBuffer(num1).reverse().toString().toCharArray();
char[] n2 = new StringBuffer(num2).reverse().toString().toCharArray();
int[] tmp = new int[m + n - 1];
// 1. ⽆进位相乘后相加
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
tmp[i + j] += (n1[i] - '0') * (n2[j] - '0');
// 2. 处理进位
int cur = 0, t = 0;
StringBuffer ret = new StringBuffer();
while (cur < m + n - 1 || t != 0)
{
if (cur < m + n - 1) t += tmp[cur++];
ret.append((char)(t % 10 + '0'));
t /= 10;
}
// 3. 处理进位
while (ret.length() > 1 && ret.charAt(ret.length() - 1) == '0')
ret.deleteCharAt((ret.length() - 1));
return ret.reverse().toString();
}
}