约定
- 数字按位存储到vector中,vector中低位存储数字的低位。比如数字123在vector中是[3,2,1],这样的好处是数字权重和数组下标对应;
- get代表greater equal than,get(A,B)为true代表A>=B;
- 减法运算总是用绝对值大的书减去绝对值小的数。
#include <iostream>
#include <vector>
#include <string>
using namespace std;
vector<int> parse(const string& s)
{
vector<int> ret;
ret.reserve(s.size());
for (int i = (int)s.size() - 1; i >= 0; i--)ret.push_back(s[i]-'0');
return ret;
}
void print(const vector<int>& v)
{
for (int i = (int)v.size() - 1; i >= 0; i--)cout << v[i];
}
vector<int> add(const vector<int>& A, const vector<int>& B)
{
int carry=0;
int a = 0; int b = 0;
vector<int> C;
while (a < A.size() || b < B.size())
{
int sum = 0;
sum += carry;
if (a < A.size())sum += A[a++];
if (b < B.size())sum += B[b++];
C.push_back(sum % 10);
carry = sum / 10;
}
if (carry)C.push_back(carry);
return C;
}
vector<int> sub(const vector<int>& A, const vector<int>& B)
{
//要求A>=B
vector<int> C = A;
for (int i = 0; i < B.size();i++)
{
C[i] -= B[i];
if (C[i] < 0)
{
C[i] += 10;
C[i + 1]--;
}
}
while (C.size()>=2 && C.back() == 0)C.pop_back();
return C;
}
bool get(const vector<int>& A, const vector<int>& B)
{
if (A.size() == B.size())
{
for (int i = (int)A.size() - 1; i >= 0; i--)
{
//if (B[i] > A[i])return false;
if (A[i] != B[i])return A[i] > B[i];
}
return true;
}
else return A.size() > B.size();
}
int main()
{
string a; cin >> a;
char op; cin >> op;
string b; cin >> b;
vector<int> A = parse(a);
vector<int> B = parse(b);
if (op == '+')print(add(A, B));
else
{
if (get(A, B))print(sub(A, B));
else
{
cout << '-';
print(sub(B, A));
}
}
return 0;
}