Given three integers A A A, B B B and C C C in ( − 2 63 , 2 63 ) (−2^{63},2^{63}) (−263,263), you are supposed to tell whether A + B > C A+B>C A+B>C.
Input Specification:
The first line of the input gives the positive number of test cases, T ( ≤ 10 ) T (≤10) T(≤10). Then T T T test cases follow, each consists of a single line containing three integers A A A, B B B and C C C, separated by single spaces.
Output Specification:
For each test case, output in one line Case #X: true
if
A
+
B
>
C
A+B>C
A+B>C, or Case #X: false
otherwise, where
X
X
X is the case number (starting from 1).
Sample Input:
3
1 2 3
2 3 4
9223372036854775807 -9223372036854775808 0
Sample Output:
Case #1: false
Case #2: true
Case #3: false
Solution:
// Talk is cheap, show me the code
// Created by Misdirection 2021-08-20 10:39:30
// All rights reserved.
#include <iostream>
#include <vector>
using namespace std;
string add(string &a, string &b){
// 保证是俩正数
int len1 = a.length(), len2 = b.length();
string ans = "";
int carry = 0, pos = 0;
while(pos < len1 && pos < len2){
int tmp = (a[len1 - 1 - pos] - '0') + (b[len2 - 1 - pos] - '0') + carry;
carry = tmp / 10;
tmp %= 10;
ans = (char)(tmp + '0') + ans;
pos++;
}
while(pos < len1){
int tmp = (a[len1 - 1 - pos] - '0') + carry;
carry = tmp / 10;
tmp %= 10;
ans = (char)(tmp + '0') + ans;
pos++;
}
while(pos < len2){
int tmp = (b[len2 - 1 - pos] - '0') + carry;
carry = tmp / 10;
tmp %= 10;
ans = (char)(tmp + '0') + ans;
pos++;
}
if(carry != 0) ans = (char)(carry + '0') + ans;
return ans;
}
bool isGreaterEqual(string &a, string &b){
// 保证是俩正数
// a == b 的话返回 true
if(a.length() != b.length()) return a.length() > b.length();
int len = a.length();
for(int i = 0; i < len; ++i)
if(a[i] != b[i]) return a[i] > b[i];
return true;
}
string sub(string &a, string &b){
// 保证是俩正数
bool isNeg = !isGreaterEqual(a, b);
if(isNeg) swap(a, b);
int len1 = a.length(), len2 = b.length();
string ans = "";
int carry = 0, pos = 0;
while(pos < len1 && pos < len2){
int tmp;
if(a[len1 - pos - 1] - carry < b[len2 - pos - 1]){
tmp = a[len1 - pos - 1] - carry - b[len2 - pos - 1] + 10;
carry = 1;
ans = (char)(tmp + '0') + ans;
}
else{
tmp = a[len1 - pos - 1] - carry - b[len2 - pos - 1];
carry = 0;
ans = (char)(tmp + '0') + ans;
}
pos++;
}
while(pos < len1){
int tmp;
if(a[len1 - pos - 1] - '0' < carry){
tmp = a[len1 - pos - 1] - '0' - carry + 10;
carry = 1;
ans = (char)(tmp + '0') + ans;
}
else{
tmp = a[len1 - pos - 1] - '0' - carry;
carry = 0;
ans = (char)(tmp + '0') + ans;
}
pos++;
}
while(ans.length() > 0 && ans[0] == '0') ans.erase(0, 1);
if(ans.length() == 0) ans = "0";
if(isNeg) ans = "-" + ans;
return ans;
}
bool cmp(string &sum, string &c){
if(sum[0] != '-' && c[0] != '-'){
if(sum.length() != c.length()) return sum.length() > c.length();
int len = sum.length();
for(int i = 0; i < len; ++i)
if(sum[i] != c[i]) return sum[i] > c[i];
return false;
}
else if(sum[0] == '-' && c[0] != '-') return false;
else if(sum[0] != '-' && c[0] == '-') return true;
else{
if(sum.length() != c.length()) return sum.length() < c.length();
int len = sum.length();
for(int i = 1; i < len; ++i)
if(sum[i] != c[i]) return sum[i] < c[i];
return false;
}
}
int main(){
string a, b, c;
int n;
cin >> n;
for(int i = 0; i < n; ++i){
cin >> a >> b >> c;
string sum;
int carry = 0;
if(a[0] != '-' && b[0] != '-') sum = add(a, b);
else if(a[0] == '-' && b[0] == '-'){
a = a.substr(1, a.length() - 1);
b = b.substr(1, b.length() - 1);
sum = "-" + add(a, b);
}
else if(a[0] != '-' && b[0] == '-'){
b = b.substr(1, b.length() - 1);
sum = sub(a, b);
}
else{
a = a.substr(1, a.length() - 1);
sum = sub(b, a);
}
if(i == n - 1) printf("Case #%d: %s", i + 1, cmp(sum, c) ? "true" : "false");
else printf("Case #%d: %s\n", i + 1, cmp(sum, c) ? "true" : "false");
}
return 0;
}