欢迎~
- 一、字符串相加
- 思路:模拟竖式加法
- 具体代码如下:
- 二、字符串相乘
- 思路:模拟竖式乘法
- 具体代码如下:
- 总结
一、字符串相加
点我直达~
思路:模拟竖式加法
- 1.将两个字符串从右往左开始进行相加,使用一个变量
ans
表示进位,如果两个字符串的个位加法和大于10,那么让进位+1,个位和再%10,然后将结果存入到新的字符串strRet
中 - 2.两个字符串的十位和十位继续相加,并且需要加上个位的进位
ans
,步骤同1 - 3.这样不断相加,假如任意一个字符串的位数加完了,另一个字符串的位数未加完,比如:123+11,那就将该字符串连同上一位的进位
ans
加上并复制到新的字符串strRet
中,注意,在代码的计算时,应该是123+011,11前面的’0’是需要补位的 - 4.最后将
strRet
逆置即可得到我们想要的结果。
具体代码如下:
写法1:
class Solution {
public:
string addStrings(string num1, string num2)
{
int end1 = num1.size() - 1;
int end2 = num2.size() - 1;
string strRet;
int ans = 0;
while (end1 >= 0 && end2 >= 0)
{
int sum = (num1[end1]-'0')+(num2[end2]-'0') + ans;
strRet += (sum % 10 + '0');
ans = sum / 10;
--end1;
--end2;
}
while(end1 >= 0)
{
int sum = ((num1[end1] - '0' + ans));
strRet += ( (sum%10) + '0');
ans = sum/10;
--end1;
}
while(end2 >= 0)
{
int sum = ((num2[end2] - '0' + ans));
strRet += ( (sum%10) + '0');
ans = sum/10;
--end2;
}
if(ans!=0)
{
strRet +=( ans + '0');
}
reverse(strRet.begin(), strRet.end());
return strRet;
}
};
写法2:
class Solution {
public:
string addStrings(string num1, string num2)
{
int i = num1.length() - 1, j = num2.length() - 1, add = 0;
string ans = "";
while (i >= 0 || j >= 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;
i -= 1;
j -= 1;
}
// 计算完以后的答案需要翻转过来
reverse(ans.begin(), ans.end());
return ans;
}
};
二、字符串相乘
点我直达~
思路:模拟竖式乘法
字符串相乘的思路与字符串相加的思路类似
- 1.任意取一个字符串作为被乘数,如果该字符串的长度比另一个字符串短,则需要在不足的位数上补’0’
- 2.两个字符串从个位开始相乘,所得结果如果大于10,则使用变量
ans
来保存进位,然后将个位的乘积%10,结果保存到新的字符串strRet
中。 - 3.继续重复2.的过程,在此期间如果任意一个字符串的长度遍历完了, 那么就将另一个字符串的剩余的位数+进位
ans
复制保存到strRet
新的字符串中。这个相加的过程可以调用字符串想加的函数完成。 - 4.最后逆置
strRet
字符串即可得到我们想要的结果。
具体代码如下:
class Solution {
public:
//将其中一个作为被乘数,将每一位拆分出来进行相乘,然后把结果累计起来
//其中,被乘数的位数如果大于2位,需要先提前加上0
string multiply(string num1, string num2)
{
string strret;
if(num2[0] == '0' || num1[0] == '0')
{
return strret+='0';
}
int end1 = num1.size() -1;
int end2 = num2.size() -1;
for(int i = end2;i>=0;--i)
{
string cur;
int add = 0;
//num2是被乘数,需要补0
for(int j = end2;j>i;--j)
{
cur+='0';
}
//开始计算乘积
for(int j = end1;j>=0;--j)
{
int val1 = (num1[j]-'0');
int val2 = (num2[i]-'0');
int sum = val1*val2+add;
cur+=(sum%10 + '0');
add = sum/10;
}
//这里如果进位不等于0,还要把进位加上
if(add!=0)
{
cur+=(add + '0');
}
//计算结果需要逆置
reverse(cur.begin(),cur.end());
//然后累加起来
strret = addStrings(strret,cur);
}
return strret;
}
string addStrings(const string &num1, const string &num2)
{
int i = num1.length() - 1, j = num2.length() - 1, add = 0;
string ans = "";
while (i >= 0 || j >= 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;
i -= 1;
j -= 1;
}
// 计算完以后的答案需要翻转过来
reverse(ans.begin(), ans.end());
return ans;
}
};
总结
通过写今天的字符串相加|字符串相乘,我大致学会了如何将字符串转化为竖式的方法进行相加/相乘。