我首先的想法是用int存储数据,但是会相加可能会出现溢出的情况,但是没关系,整个加法可以分为两步(这三个数都是int类型的范围):
1、异号相加,与第三个数相比。异号相加不存在溢出的情况,所以直接相加比较即可
2、同号相加,分两种情况
1)相加后数溢出,会变号(或者变为0)。
2)相加后数不溢出,没有变号。
对于情况1)异号后判断相加数中随便一个数,如果为正数,则这次运算结果为true;如果为负数,则这次运算结果为false
对于情况2),直接相加比较即可。
由此写出代码。。。。。。。。。。。。。。。。居然死活通不过不了。。。。。。。每次只有第一个正确,后两个测试数据错误。希望有人能和我讨论一下。
最后我查阅网上资料,大家也是出错,最后转用double或者long int来通过的。意思是这一题考察的是对int的范围认识。。。(ŎдŎ;) ヽ(ー_ー)ノ
/* coded by indere
题目:
给定区间[-2^31, 2^31]内的3个整数A、B和C,请判断A + B是否大于C。
输入格式:
输入第1行给出正整数T(<= 10),是测试用例的个数。随后给出T组测试用例,
每组占一行,顺序给出A、B和C。整数间以空格分隔。
输出格式:
对每组测试用例,在一行中输出“Case #X: true”如果A + B > C,否则输出“Case #X: false”,
其中X是测试用例的编号(从1开始)。
输入样例:
4
1 2 3
2 3 4
2147483647 0 2147483646
0 - 2147483648 - 2147483647
输出样例:
Case #1: false
Case #2: true
Case #3: true
Case #4: false
*/
#include<stdio.h>
#include<stdlib.h>
#define NUMSIZE 3
void judgeArr(int **arr, int *result, int num); /*判断数据中相加是否满足A+B>C*/
void printResult(int *result, int num); /*输出结果*/
int main() {
int num;
scanf("%d", &num);
int **arr = (int **)malloc(sizeof(int *) * num); /*待判断的数组*/
int *result = (int *)malloc(sizeof(int) * num); /*存放结果的数组*/
for (int i = 0; i < num; i++) {
arr[i] = (int *)malloc(sizeof(int) * NUMSIZE);
scanf("%d %d %d", &arr[i][0], &arr[i][1], &arr[i][2]);
}
judgeArr(arr, result, num);
printResult(result, num);
return 0;
}
void judgeArr(int **arr, int *result, int num) {
for (int i = 0; i < num; i++) {
if ((arr[i][0] > 0 && arr[i][1] > 0) || (arr[i][0] < 0 && arr[i][1] < 0)) { /*同号*/
int temp = arr[i][0] + arr[i][1];
if ((temp <= 0 && arr[i][0] > 0) || (temp >= 0 && arr[i][0] < 0)) { /*和变号,溢出*/
if (arr[i][0] > 0) /*两个正数相加溢出*/
result[i] = 1;
else /*两个负数相加溢出*/
result[i] = 0;
}
else { /*未溢出*/
if (arr[i][0] + arr[i][1] > arr[i][2]) result[i] = 1;
else result[i] = 0;
}
}
else { /*异号或者为0,不会溢出*/
if (arr[i][0] + arr[i][1] > arr[i][2]) result[i] = 1;
else result[i] = 0;
}
}
}
void printResult(int *result, int num) {
for (int i = 0; i < num; i++) {
if (result[i]) printf("Case #%d: true\n", i+1);
else printf("Case #%d: false\n", i+1);
}
}
通过例子
int main() {
int num;
scanf("%d", &num);
double **arr = (double **)malloc(sizeof(double *) * num);
double *result = (double *)malloc(sizeof(double) * num);
for (int i = 0; i < num; i++) {
arr[i] = (double *)malloc(sizeof(double) * 3);
scanf("%lf %lf %lf", &arr[i][0], &arr[i][1], &arr[i][2]);
}
for (int i = 0; i < num; i++) {
if (arr[i][0] + arr[i][1] > arr[i][2])
result[i] = 1;
else
result[i] = 0;
}
for (int i = 0; i < num; i++) {
if (result[i]) printf("Case #%d: true\n", i + 1);
else printf("Case #%d: false\n", i + 1);
}
return 0;
}