两个数都是高精度,且有符号
#include <iostream>
#include <cstring>
#include <algorithm>
#include<vector>
using namespace std;
int cmp(vector<int>&A, vector<int>&B) {
//相等0,大于1,小于-1
if (A.size() > B.size()) return 1;
if (A.size() < B.size()) return -1;
//从高位开始判断
for (int i = A.size()-1 ; i>=0; i--) {
if (A[i] > B[i]) return 1;
if (A[i] < B[i]) return -1;
}
return 0;
}
vector<int> add(vector<int>&A, vector<int>&B) {
vector<int> C;
for (int i = 0, t = 0; i < A.size() || i < B.size() || t ; i++) {
if (i < A.size()) t += A[i];
if (i < B.size()) t += B[i];
C.push_back(t % 10);
t /= 10;
}
return C;
}
vector<int> sub(vector<int> &A, vector<int>&B) {
vector<int> C;
//进行减法的一定是A大于B,于是只用判断A的长度就行
for (int i = 0, t = 0; i < A.size() ; i++ ) {
t = A[i] - t ;
if (i < B.size()) t -= B[i];
C.push_back((t + 10) % 10); //避免出现负数
//产生借位
if (t < 0) t = 1;
else t = 0;
}
while (C.size() > 1 && C.back() == 0) C.pop_back();
return C;
}
vector<int> mul(vector<int>&A, vector<int>&B) {
vector<int>C(A.size() + B.size() , 0); //确定C的长度,不会大于AB长度的和。
for (int i = 0; i < A.size() ; i++)
for (int j = 0; j < B.size(); 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;
}
while (C.size() > 1 && C.back() == 0) C.pop_back();
return C;
}
void print(vector<int> A) {
//这里不用引用
for (int i = A.size() - 1 ; i >= 0; i--) cout << A[i];
cout << endl;
}
int main() {
string a, b;
cin >> a >> b;
int na = 1, nb = 1; //表示数值的正负
if (a[0] == '-') na = -1, a=a.substr(1);
if (b[0] == '-') nb = -1, b=b.substr(1);
vector<int>A, B;
for (int i = a.size() - 1; i >= 0; i--) A.push_back(a[i] - '0');
for (int i = b.size() - 1; i >= 0 ; i--) B.push_back(b[i] - '0');
vector<int> C;
if ( na * nb > 0 ) {
//同号
bool is_swap = false;
if (cmp(A, B) == -1) {
is_swap = true;
swap(A, B);
swap(na, nb); //记得交换符号啊
}
//+
C.clear();
C=add(A, B);
if( C.size()==1 && C[0]==0) cout<<0<<endl;
else
{
if (na < 0) cout << "-";
print(C );
}
//-
//都是正数且A小于B || 都是负数且A大于B
C.clear();
C=sub(A, B);
if( C.size()==1 && C[0]==0) cout<<0<<endl;
else{
if ( (na > 0 && is_swap) || (na < 0 && !is_swap)) cout << "-";
print( C);
}
//*
C.clear();
C=mul(A, B);
if( C.size()==1 && C[0]==0) cout<<0<<endl;
else{
if ( a != "0" && b != "0") print( C );
}
}
else {
//异号
bool is_swap = false;
if (cmp(A, B) == -1) {
is_swap = true;
swap(A, B);
swap(na, nb); //记得交换符号啊
}
//+ (异号!!!)
C.clear();
C=sub(A, B);
if( C.size()==1 && C[0]==0) cout<<0<<endl;
else{
if ( na < 0 ) cout << "-";
print( C );}
//- (异号!!!)
C.clear();
C=add(A, B);
if( C.size()==1 && C[0]==0) cout<<0<<endl;
else{if ( (na < 0 && !is_swap) || (na > 0 && is_swap)) cout << "-";
print( C);}
//*
C.clear();
C=mul(A, B);
if( C.size()==1 && C[0]==0) cout<<0<<endl;
else{
if ( a != "0" && b != "0") {cout << "-" ; print( mul(A, B)) ;}
else cout<<0;}
}
return 0;
}