【数据结构·考研】字符串相加与字符串相乘

415. 字符串相加

给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-strings
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:本题我们只需要对两个大整数模拟「竖式加法」的过程。对应位置的两个整数相加之后,如果当前位和超过 10,则向高位进一位。

我们定义两个指针 i 和 j 分别指向 num1和 num2 的末尾,即最低位,同时定义一个变量 add 维护当前是否有进位。

①当两个数位数相同时,当最后一位相加完毕后(也就是指针等于 -1 时)没有进位,那么此时相加操作完成。

②若两个数位数不相同,并且其中一个字符串的指针 i 已经指向-1,那么在另外一个字符串的指针 j 还未指向 -1 时,把字符串i当前的位置进行补 0 操作。当 i 和 j 都指向 -1 ,查看有无进位,若没有进位,相加操作结束,若有,再循环一次结束。

每次计算好一位的值就把它 push_back 到 ans 字符串中,等计算结束再执行reverse操作。

综上所述我们的循环结束条件应当是:

while (i >= 0 || j >= 0 || add != 0)

代码如下:

时间复杂度:O(max(len1​,len2​))

空间复杂度:O(1)

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;

string addStrings(string num1,string num2){
	int i = num1.size() - 1;
	int j = num2.size() - 1;
	int add = 0;
	string ans = "";
	while(j >= 0 || i >= 0 || add != 0){
		int x = i >= 0 ? num1[i] - '0' : 0;
		int y = j >= 0 ? num2[j] - '0' : 0;
		int result = x + y + add;
		ans.push_back('0' + result % 10);
		add = result / 10;
		j --;
		i --;
	}
	reverse(ans.begin(),ans.end());
	return ans;
} 

int main(){
	string str1 = "123";
	string str2 = "987";
	cout<<addStrings(str1,str2);
}

43. 字符串相乘

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。

示例 1:

输入: num1 = "2", num2 = "3"
输出: "6"

示例 2:

输入: num1 = "123", num2 = "456"
输出: "56088"

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/multiply-strings
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:「竖式乘法」的过程:从右往左遍历乘数,将乘数的每一位与被乘数相乘得到对应的结果,再将每次得到的结果累加。每计算完一位,下一位就要在计算结果末尾进行补 0 操作。而每一位计算的过程和计算完之后累加的过程又与字符串相加时的思想相同,所以我们利用了字符串相加的代码。

代码如下:

时间复杂度:O(mn+n^2)

空间复杂度:O(m+n)

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;

string addStrings(string num1,string num2){
	int i = num1.size() - 1;
	int j = num2.size() - 1;
	int add = 0;
	string ans = "";
	while(j >= 0 || i >= 0 || add != 0){
		int x = i >= 0 ? num1[i] - '0' : 0;
		int y = j >= 0 ? num2[j] - '0' : 0;
		int result = x + y + add;
		ans.push_back('0' + result % 10);
		add = result / 10;
		j --;
		i --;
	}
	reverse(ans.begin(),ans.end());
	return ans;
} 

string multiply(string num1,string num2){
	if(num1 == "0" || num2 == "0") return "0";
	string ans = "";
	int n = num1.size() - 1;
	int m = num2.size() - 1;
	for(int i = n;i >= 0;i--){
		string cur;
		int add = 0;
		for(int k = n;k > i;k--)
            cur.push_back('0');
		int y = num2[i] - '0';
		for(int j = m;j >= 0;j--){
			int x = num1[j] - '0';
			int result = x * y + add;
		    cur.push_back(result % 10 + '0');
			add = result / 10;	
		}
		if(add != 0) {
            cur.push_back(add % 10 + '0');
        }
		reverse(cur.begin(),cur.end());
		ans = addStrings(ans,cur);
	}
	return ans;
} 

int main(){
	string str1 = "123";
	string str2 = "987";
	cout<<multiply(str1,str2);
}

猜你喜欢

转载自blog.csdn.net/cjw838982809/article/details/107979506