Given three integers A, B and C in [-2^63^, 2^63^], you are supposed to tell whether A+B > C.
Input Specification:
The first line of the input gives the positive number of test cases, T (<=10). Then T test cases follow, each consists of a single line containing three integers A, B and C, separated by single spaces.
Output Specification:
For each test case, output in one line “Case #X: true” if A+B>C, or “Case #X: false” otherwise, where 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
解析:使用大数补码运算,将减法转换为补码运算
#include"stdio.h"
#include<string.h>
#include<cstdlib>
const int maxn = 25;
struct bign {
int d[maxn] = { 0 };
int sign=1;
int len;
};
bign change(char str[]) {
bign a;
int temp = 0;
if (str[0] == '-') {
a.sign = -1;
temp = 1;
}
a.len = strlen(str);
for (int i =0; i < strlen(str)-temp; i++) {
a.d[i] = str[a.len - 1 - i] - '0';
}
a.len -= temp;
return a;
}
bign to_buma(bign a) {
bign c;
c.len = maxn;
int x=0;
while (a.d[x] == 0 && x<a.len) {
x++;
}
if (a.d[x] == 0) { c.d[x] = 0; return c; }
else c.d[x] = 10 - a.d[x];
for (int i = x+1; i < maxn; i++) {
c.d[i] = 9 - a.d[i];
}
return c;
}
bign add(bign a, bign b) {
int cnt = 0;
bign c;
c.len = maxn;
for (int i = 0; i < maxn ; i++) {
c.d[i] = a.d[i] + b.d[i] + cnt;
if (c.d[i] >= 10) {
c.d[i] -= 10;
cnt = 1;
}
else cnt = 0;
}
return c;
}
int main()
{
int n;
bign a, b, c, ans, d;
char sa[maxn], sb[maxn], sc[maxn];
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%s %s %s", sa, sb, sc);
a = change(sa);
b = change(sb);
c = change(sc);
if (a.sign == -1) a = to_buma(a);
if (b.sign == -1) b = to_buma(b);
c.sign *= (-1);
if (c.sign == -1) c = to_buma(c);
ans = add(a, b);
ans = add(ans, c);
bool flag = true;
for (int i = 0; ans.d[i] == 0 &&i<ans.len; i++) {
if (i == ans.len-1) {
flag = false;
}
}
if (ans.d[ans.len-1]>0||flag==false) {
printf("Case #%d: false\n", i+1);
}
else {
printf("Case #%d: true\n", i+1);
}
}
return 0;
}