Halo,这里是Ppeua。平时主要更新C++,数据结构算法,Linux与ROS…感兴趣就关注我bua!
Leetcode 43
题目:
示例:
题解:
这是一个大数相乘的问题,类似于这篇文章中的高精度乘法 但是高精度乘法只是其中的一个数超过了整形的最大值。这里可以是两个数。所以我们需要进行一下数据的处理。
1.先将num1与num2进行一个string to int的处理:让其每一位都减去‘0’得到int中对应的数字
2.因为我们要做的是模拟笔算中的乘法,从个位开始算,所以要将其倒着存储:从后往前依次push到vector中
3.创建答案数组,将其num1(vector)与num2(vector)每一位相乘,放入对应下标和中,为什么要放入下标和中呢?
观察下面的式子就能明白啦。
4.因为我们计算的时候是将这个结果直接存入对应的位数中,现在需要计算最后的结果,需要提取他们的个位数
5.因为最开始分配的空间是以num1.size()+num2.size()分配的,可能会出现计算的结果仅是五位数,而答案数组的空间是6位数的结果.需要去除数组尾端的0
6.最后将结果反转依次存入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; } };