题目
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。
示例 1:
输入: num1 = “2”, num2 = “3”
输出: “6”
示例 2:
输入: num1 = “123”, num2 = “456”
输出: “56088”
提示:
1 <= num1.length, num2.length <= 200
num1 和 num2 只能由数字组成。
num1 和 num2 都不包含任何前导零,除了数字0本身。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/multiply-strings
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
难得自己写的时间快,内存消耗少,特意截图mark一下
思路
本题模拟乘法过程,通过两个数组来实现,具体过程不是很难,关键点在处理里面的字符串上,对于ans的处理有分类,是否有初始值很关键。还有就是增加一个add值,作为对上面的记忆化处理。
前置知识点
- 对于
string str="00000001";
的处理,这里可以作为一个板子,用于处理"0000001123"的情况。
对于c++中这个的处理,搜了蛮多博客,但是讲的是驴唇不对马嘴,有一个离谱的博客,标题写的是c++中format的应用,但是里面的内容是java中format的应用。format貌似是一种处理字符串中的方法,不过我也没找到能快速上手的办法。。。从实用主义出发,后面有机会学到再说吧。
void dezero(string &x)
{
int i=0;
for(i=0;i<x.length()-1;i++)
if(x[i]!='0')
break;
x.erase(0,i);
return ;
}
- string str=“0123”;str.erase(0,2);//str消除了0到2的位置的值,此时str=“3”
- reverse(str.begin(),str.end());//str由0123翻转成3210
代码
#include<string>
#include<cstring>
class Solution {
public:
void dezero(string &x)
{
int i=0;
for(i=0;i<x.length()-1;i++)
if(x[i]!='0')
break;
x.erase(0,i);
return ;
}
string multiply(string num1, string num2) {
string ans="";
int len1=num1.length(),len2=num2.length();
int add=0;
for(int i=len1-1;i>=0;i--)
{
for(int j=len2-1;j>=0;j--)
{
int k=len1-1-i+len2-1-j;//此处k用于定位ans
int now1=num1[i]-'0',now2=num2[j]-'0';
int now;
/*如果ans已经有值了,比如123*456,处理的时候是
先算3*456=1368,ans此时等于8631,然后计算2*456
对2*6来说,此时now=2*6+0+6,add=1,ans[1]=8,
*/if(ans.length()>=k+1)
{
now=now1*now2+add+ans[k]-'0';
add=now/10;
ans[k]=(now%10+'0');
}
else
{
now=now1*now2+add;
add=now/10;
ans.push_back(now%10+'0');
}
}
/*此处处理add进位,比如3*456,上面的for循环
实现ans存入863(3*456=1368),然后还剩add进位在下面处理
*/
if(add!=0)
ans.push_back(add+'0');
add=0;
}
reverse(ans.begin(),ans.end());
dezero(ans);
// for(int i=0;i<ans.length();i++)
// {
// if(ans[i]!='0')
// {
// ans.format("%s",&ans[i]);
// break;
// }
// }
return ans;
}
};