题目
给定区间 [ − 2 31 , 2 31 -2^{31},2^{31} −231,231] 内的 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 开始)。
思路
关键是处理溢出问题,溢出情况有:
a和b都是正数,a+b >= 2^32;
a和b都是负数,a+b <= -2^32;
因此溢出只出现在a b 同号,a b异号的话直接按 (a+b) > c 来算就可以。
对于a b同号,也有两种处理方法:
- b c 同号, 将 (a+b) > c 转换成 a > (c - b), 此时 (c - b)必定不会出现溢出;
- b c 异号, 由于式子左边同号,相加后符号不变,式子右边跟左边异号,因此不需要计算即可知道大小关系。
但是,我写的 就是通过不了。别人的就ok,我真的找不到问题出在哪里,天啊。
通过代码
#include <stdio.h>
#include <stdbool.h>
#include <stdint.h>
int main(void){
int times;
scanf("%d",×);
bool result[times];
for(int i = 0; i < times ;i++){
int64_t a,b,c;
scanf("%ld %ld %ld", &a, &b, &c);
if(a == 0 || b == 0){
result[i] = (a + b) > c;
continue;
}
bool symbol_a = a > 0;
bool symbol_b = b > 0;
bool symbol_c = c >= 0;
if(symbol_a != symbol_b){
result[i] = (a + b) > c;
}else{
if(symbol_b == symbol_c){
result[i] = a > (c - b);
}else{
result[i] = symbol_a;
}
}
}
for(int i = 0; i < times ;i++){
printf("Case #%d: %s\n", i + 1, result[i]?"true":"false");
}
return 0;
}
我的代码
#include<stdio.h>
int d[10001];
int main()
{
long long a,b,c;
int num,i;
int j,k,l;
scanf("%d",&num);
if(num >= 0)
{
for(i = 0; i < num; i++)
{
scanf("%lld %lld %lld",&a,&b,&c);
j = a > 0;
k = b > 0;
l = c >= 0;
if(j == k)
if(k == l)
d[i] = (a > c - b)?1:0;
else
d[i] = j;
else
d[i] = (a + b > c)?1:0;
}
for(i = 0; i < num; i++)
{
printf("Case #%d: %s\n",i+1,d[i]?"true":"flase");
}
}
return 0;
}
为什么,希望大神们帮我解答一下,我真的很在意!!!
ok,是flase 打错了 false