A+B 和 C

题目

给定区间 [ − 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同号,也有两种处理方法:

  1. b c 同号, 将 (a+b) > c 转换成 a > (c - b), 此时 (c - b)必定不会出现溢出;
  2. b c 异号, 由于式子左边同号,相加后符号不变,式子右边跟左边异号,因此不需要计算即可知道大小关系。
    但是,我写的 就是通过不了。别人的就ok,我真的找不到问题出在哪里,天啊。
通过代码
#include <stdio.h>
#include <stdbool.h>
#include <stdint.h>

int main(void){
    int times;
    scanf("%d",&times);
    
    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

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值