作者简介:C/C++ 、Golang 领域耕耘者,创作者
个人主页:作者主页
活动地址:CSDN21天学习挑战赛
题目来源: leetcode官网
如果感觉博主的文章还不错的话,还请关注➕ 、点赞👍 、收藏🧡三连支持一下博主哦~~~
💜 题目描述
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。
示例1:
输入: num1 = “2”, num2 = “3”
输出: “6”
示例2:
输入: num1 = “123”, num2 = “456”
输出: “56088”
🧡 算法分析
模拟题
直接模拟竖式计算, 乘积的最大长度为两个乘数的长度之和
💚 代码实现
class Solution {
public:
string multiply(string num1, string num2) {
// “ 高精度 * 高精度 ” 问题
vector<int> A, B; // 数组保存字符串
int n = num1.size() , m = num2.size();
for(int i = n -1; i >= 0; i --) A.push_back(num1[i] - '0'); // 逆序存放到数组里面
for(int i = m -1; i >= 0; i --) B.push_back(num2[i] - '0');
vector<int> C(n + m); // 定义答案数组
for(int i = 0; i < n; i ++)
for(int j = 0; j < m; j ++)
C[i + j] += A[i] * B[j];
// 然后处理的进位
for(int i = 0, t = 0; i < C.size(); i ++)
{
t += C[i];
C[i] = t % 10;
t /= 10;
}
int k = C.size() -1;
// 去除前导0
while(k > 0 && !C[k]) k --;
string re;
while(k >=0) re += C[k --] + '0';
return re;
}
};
执行结果:
💙 时间复杂度分析
设两个数字的位数分别是 n 和m,竖式乘法为两层循环错位相乘,故时间按复杂度是 O(nm)。
如果觉得对你有帮助的话:
👍 点赞,你的认可是我创作的动力!
🧡 收藏,你的青睐是我努力的方向!
✏️ 评论,你的意见是我进步的财富!