include [HTML_REMOVED]
include [HTML_REMOVED]
using namespace std;
/*
比较A与B的大小 A,B都为正整数
A>=B时返回true A[HTML_REMOVED] &A, vector[HTML_REMOVED] &B)
{
//先比较A与B的长度
if (A.size() != B.size())
return A.size() > B.size(); //A>B时返回true A<B时返回false
//再比较A与B的大小,从高位开始比较
for (int i = A.size() - 1; i >= 0; --i) {
if (A[i] != B[i])
return A[i] > B[i];
}
return true; //A=B
}
//高精度减法 A>=B
vector[HTML_REMOVED] sub(vector[HTML_REMOVED] &A, vector[HTML_REMOVED] &B)
{
vector[HTML_REMOVED] C;
int t = 0; //借位
//从低位开始相减
for (int i = 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;
}
//去掉前导0
while (C.size() > 1 && C.back() == 0)
C.pop_back();
return C;
}
//高精度加法 A+B A,B均为正整数
vector[HTML_REMOVED] add(vector[HTML_REMOVED] &A, vector[HTML_REMOVED] &B)
{
vector[HTML_REMOVED] C;
int t = 0; //进位
//从低位开始相加
for (int i = 0; i < A.size() || i < B.size(); ++i) {
if (i < A.size())
t += A[i];
if (i < B.size())
t += B[i];
C.push_back(t % 10);
t /= 10; //进位
}
//最高位仍有进位时
if(t) C.push_back(t);
return C;
}
int main(void)
{
string a, b;
vector[HTML_REMOVED] A, B; //存储绝对值
bool sign_flagA = false, sign_flagB = false; //负号标志,为1时为负号
//输入两个字符串
cin >> a >> b; //a = a0a1...
//将字符串转换成容器,逆序
if (a[0] == '-') //a为负数时
sign_flagA = true;
if (b[0] == '-')
sign_flagB = true;
if (sign_flagA == true) { //A为负数时
for (int i = a.size() - 1; i > 0; --i)
A.push_back(a[i] - '0'); //A[0]为最低位
} else { //A为非负数时
for (int i = a.size() - 1; i >= 0; --i)
A.push_back(a[i] - '0'); //A[0]为最低位
}
if (sign_flagB == true) { //B为负数时
for (int i = b.size() - 1; i > 0; --i)
B.push_back(b[i] - '0'); //A[0]为最低位
} else { //B为非负数时
for (int i = b.size() - 1; i >= 0; --i)
B.push_back(b[i] - '0'); //A[0]为最低位
}
//判断A与B的大小 A为正整数,B为负整数 A-B=A+|B|
if (sign_flagA == false && sign_flagB == true) {
auto C = add(A, B);
//逆序输出 正数
for (int i = C.size() - 1; i >= 0; --i)
printf("%d", C[i]);
}
//判断A与B的大小 A为负整数,B为正整数 A-B=-(|A|+|B|)
if (sign_flagA == true && sign_flagB == false) {
auto C = add(A, B);
printf("-");
//逆序输出
for (int i = C.size() - 1; i >= 0; --i)
printf("%d", C[i]);
}
//判断A与B的大小 A为负整数,B为负整数 A-B
if (sign_flagA == true && sign_flagB == true) {
if (cmp(A, B)) { //|A|>=|B|时 A-B=-(|A|-|B|)
auto C = sub(A, B); //|A|-|B|
printf("-");
//逆序输出
for (int i = C.size() - 1; i >= 0; --i)
printf("%d", C[i]);
} else { //|A|<|B|时 A-B=|B|-|A|
auto C = sub(B, A); //|B|-|A|
//逆序输出
for (int i = C.size() - 1; i >= 0; --i)
printf("%d", C[i]);
}
}
//判断A与B的大小 A,B都为正整数
if (sign_flagA == false && sign_flagB == false) {
if (cmp(A, B)) { //A>=B时
auto C = sub(A, B); //A-B
//逆序输出
for (int i = C.size() - 1; i >= 0; --i)
printf("%d", C[i]);
} else { //A<B时
auto C = sub(B, A); //A-B = -(B-A)
printf("-");
//逆序输出
for (int i = C.size() - 1; i >= 0; --i)
printf("%d", C[i]);
}
}
return 0;
}
分开讨论了两个输入数据的正负性