Halo,这里是Ppeua。平时主要更新C++,数据结构算法,Linux与ROS…感兴趣就关注我bua!
Leetcode 43
- 题目:
- 示例:
- 题解:
- 详细图解:
- 代码实现:
题目:
示例:
题解:
这是一个大数相乘的问题,类似于这篇文章中的高精度乘法 但是高精度乘法只是其中的一个数超过了整形的最大值。这里可以是两个数。所以我们需要进行一下数据的处理。
-
先将num1与num2进行一个string to int的处理:让其每一位都减去‘0’得到int中对应的数字
-
因为我们要做的是模拟笔算中的乘法,从个位开始算,所以要将其倒着存储:从后往前依次push到vector中
-
创建答案数组,将其num1(vector)与num2(vector)每一位相乘,放入对应下标和中,为什么要放入下标和中呢?
观察下面的式子就能明白啦。
-
因为我们计算的时候是将这个结果直接存入对应的位数中,现在需要计算最后的结果,需要提取他们的个位数
-
因为最开始分配的空间是以num1.size()+num2.size()分配的,可能会出现计算的结果仅是五位数,而答案数组的空间是6位数的结果.需要去除数组尾端的0
-
最后将结果反转依次存入string中即可
详细图解:
代码实现:
class Solution {
public:string multiply(string num1, string num2) {vector<int>v1,v2;for(int i=num1.size()-1;i>=0;i--)v1.push_back(num1[i]-'0');for(int i=num2.size()-1;i>=0;i--)v2.push_back(num2[i]-'0');vector<int>ans(num1.size()+num2.size());for(int i=0;i<num1.size();i++){for(int j=0;j<num2.size();j++){ans[i+j]+=v1[i]*v2[j];}}int t=0;for(int i=0;i<ans.size();i++){t+=ans[i];ans[i]=t%10;t/=10;}int k=ans.size()-1;while(k>0&&ans[k]==0)k--;string res;while(k>=0)res+=ans[k--]+'0';return res;}
};
class Solution {
public:
string multiply(string num1, string num2) {
vectorv1,v2;
for(int i=num1.size()-1;i>=0;i–)v1.push_back(num1[i]-‘0’);
for(int i=num2.size()-1;i>=0;i–)v2.push_back(num2[i]-‘0’);
vectorans(num1.size()+num2.size());
for(int i=0;i<num1.size();i++)
{
for(int j=0;j<num2.size();j++)
{
ans[i+j]+=v1[i]*v2[j];
}
}
int t=0;
for(int i=0;i<ans.size();i++){
t+=ans[i];
ans[i]=t%10;
t/=10;
}
int k=ans.size()-1;
while(k>0&&ans[k]==0)k–;
string res;
while(k>=0)res+=ans[k–]+‘0’;
return res;
}
(k>0&&ans[k]==0)k–; string res;
while(k>=0)res+=ans[k–]+‘0’;
return res;
}
};