问题描述
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/2113b6bf34d516f7b45649c27b2d52dd.png)
思路:直接按照普通的加法进行模拟即可,这里需要注意的是我们将得到的结果存放到res中,在最后进行输出的时候需要按照高位到低位的方式进行输出,所以需要将res进行翻转
代码
class Solution {
public:
string addStrings(string num1, string num2) {
string res = "";
int carry = 0;
for (int i = num1.size()-1, j = num2.size()-1; i >= 0 || j >= 0; i--, j--){
int temp = carry;
if (i >= 0) temp += num1[i] - '0';
if (j >= 0) temp += num2[j] - '0';
res += (temp % 10) + '0';
carry = temp / 10;
}
if (carry){
res += carry + '0';
}
reverse(res.begin(), res.end());
return res;
}
};
结果
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/86ec6cc639d6193f5e4a87d2093b57cd.png)
问题描述![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/02e46d8e0d36a751ac15b51f6c16b5c6.png)
思路:算式的模拟,这里需要注意的是如果当前位不够减,就需要向前借位,有时候需要向前借多位,例如101-2对于最后一位而言,他需要向前借1位,但它的上一位是0,那么0也需要向前借1位…(这个过程实际上是一个循环的过程)
代码
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
string sub(string a, string b){
string res = "";
int i, j;
for (i = a.size()-1, j = b.size()-1; i >= 0 && j >= 0; i--, j--){
while(a[i] < b[j]){
int k = i-1;
while(k > 0 && a[k] == '0') k--;
a[k]--;
a[k+1] += 10;
}
res += a[i] - b[j] + '0';
}
while(i >= 0){
res += a[i--];
}
reverse(res.begin(), res.end());
i = 0;
while(res[i] == '0' && i < res.size()-1) i++;
res = res.substr(i);
return res;
}
bool cmp(string a, string b){
if (a.size() != b.size()) return a.size() > b.size();
else return a >= b;
}
int main(){
string a, b;
cin>>a>>b;
if (!cmp(a, b)){
cout<<"-";
swap(a, b);
}
cout<<sub(a, b);
return 0;
}
字符串乘法
问题描述
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/d984e21aa9ed9cc3c11e35d30a79ff0b.png)
思路:进行模拟,对于nums2而言,用他的每一位和nums1进行相乘,得到的结果暂存到temp中,需要注意的是temp可能会需要补0,再将temp进行reverse和res相加即可
代码
class Solution {
public:
string multiply(string num1, string num2) {
if (num1 == "0" || num2 == "0") return "0";
string res = "";
for (int i = num2.size()-1; i >= 0; i--){
string temp = "";
for (int j = i+1; j < num2.size(); j++) temp += '0';
int t = num2[i] - '0', carry = 0;
for (int j = num1.size()-1; j >= 0; j--){
int v = t * (num1[j] - '0') + carry;
temp += (v % 10) + '0';
carry = v/ 10;
}
while(carry){
temp += carry%10 + '0';
carry /= 10;
}
reverse(temp.begin(), temp.end());
res = addStrings(res, temp);
}
return res;
}
string addStrings(string num1, string num2) {
string res = "";
int carry = 0;
for (int i = num1.size()-1, j = num2.size()-1; i >= 0 || j >= 0; i--, j--){
int temp = carry;
if (i >= 0) temp += num1[i] - '0';
if (j >= 0) temp += num2[j] - '0';
res += (temp % 10) + '0';
carry = temp / 10;
}
if (carry){
res += carry + '0';
}
reverse(res.begin(), res.end());
return res;
}
};
结果
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/83ee32f4bf0866c8997f60895415a610.png)
问题描述
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/1cb1cb1b46ca31a2770d5abf21cf48ca.png)
思路:按照算式除法进行模拟
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
string add(string a, string b){
string res = "";
int i, j;
int carry = 0;
for (i = a.size()-1, j = b.size()-1; i >= 0 || j >= 0; i--, j--){
int temp = carry;
if (i >= 0) temp += a[i] - '0';
if (j >= 0) temp += b[j] - '0';
res += (temp % 10) + '0';
carry = temp / 10;
}
if (carry){
res += carry + '0';
}
reverse(res.begin(), res.end());
return res;
}
string mulitply(string a, string b){
string res = "";
for (int i = 0; i < b.size(); i++){
int t = b[i] - '0', carry = 0;
string temp = "";
for (int j = i+1; j < b.size(); j++) temp += '0';
for (int j = a.size()-1; j >= 0; j--){
int v = t * (a[j] - '0') + carry;
temp += (v%10) + '0';
carry = v / 10;
}
while(carry){
temp += (carry%10) + '0';
carry /= 10;
}
reverse(temp.begin(), temp.end());
res = add(res, temp);
}
return res;
}
int main(){
string a, b;
cin>>a>>b;
if (a == "0" || b == "0") cout<<"0";
else cout<<mulitply(a, b);
return 0;
}