求教 pat 1065. A+B and C (64bit) 一个疑惑

十七岁_ 2015-02-05 12:31:40
请问 t = a + b; t <= 0;
与直接写成 a + b <= 0; 有什么区别??
为什么代码1只通过一组测试 二代码2全部通过??
真是奇怪 搞得我一头雾水。。。
//代码1
#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
long long a,b,c,t;
int n;
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> a >> b >> c;
// t = a + b;
printf("Case #%d: ",i);
if (a > 0 && b > 0 && (a+b) <= 0) printf("true\n");
else if (a < 0 && b < 0 && (a+b) >= 0) printf("false\n");
else
{
if ((a+b) > c) printf("true\n");
else printf("false\n");
}
}
return 0;
}

//代码2
#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
long long a,b,c,t;
int n;
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> a >> b >> c;
t = a + b;
printf("Case #%d: ",i);
if (a > 0 && b > 0 && t <= 0) printf("true\n");
else if (a < 0 && b < 0 && t >= 0) printf("false\n");
else
{
if (t > c) printf("true\n");
else printf("false\n");
}
}
return 0;
}
...全文
924 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
十七岁_ 2017-07-29
  • 打赏
  • 举报
回复
引用 10 楼 sinat_15652193 的回复:
[quote=引用 4 楼 u010217750 的回复:] 我已经找到答案了 谢谢各位~
答案到底是什么?[/quote]我回复在11楼
十七岁_ 2017-07-29
  • 打赏
  • 举报
回复
记得当时是找到答案了,忘了写下来,现在也记不起来了。好像是a+b在数值过大的时候会发生溢出,那正数就会变成负数。而对结果进行赋值后就会。。。。这里想不起来了,有兴趣可以调试测试下,应该能找到答案。不好意思各位,没帮上忙,后来没有再做c/c++相关的编程题了。
sinat_15652193 2017-07-02
  • 打赏
  • 举报
回复
引用 4 楼 u010217750 的回复:
我已经找到答案了 谢谢各位~
答案到底是什么?
弯曲时空Crape 2017-03-01
  • 打赏
  • 举报
回复
首先告诉大家一个秘密,下面的代码编译运行后输出的内容是:

16

#include<stdio.h>
int main(void)
{
    printf("%d\n", sizeof(long double));
    return 0;
}
然后这是我做题的代码:

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
int main(void)
{
    int N;
    long double x, y, u;
    bool *R;
    scanf("%d", &N);
    R=(bool *)calloc(N, sizeof(bool));
    for(int j=0;j<N;j++)
    {
        scanf("%llf %llf %llf", &x, &y, &u);
        if(x+y>u)   R[j]=true;
        else        R[j]=false;
    }
    for(int j=0;j<N;j++)
    {
        printf("Case #%d: ", j+1);
        if(R[j])    puts("true");
        else        puts("false");
    }
    free(R);
    return 0;
}
风一样的年代 2015-07-28
  • 打赏
  • 举报
回复
答案是什么呢,为什么a+b只有赋值后才可以检测是否溢出?
晨曦寒水 2015-04-11
  • 打赏
  • 举报
回复
引用 4 楼 u010217750 的回复:
我已经找到答案了 谢谢各位~
答案是什么?我也有这个疑惑。。
赵4老师 2015-02-05
  • 打赏
  • 举报
回复
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程! 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步Debug版对应汇编一行! 单步Debug版对应汇编千行不如单步Release版对应汇编一行! VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
fly_dragon_fly 2015-02-05
  • 打赏
  • 举报
回复
正常是没有区别的,但在溢出时,好像标准没定义怎么处理,理论上来说a+b<=0应该总是保证得到正确结果。另一种就不一定了。 对于以前的int来说,在vc和gcc上没区别,溢出结果会不一致,但新的long long不一样,gcc的处理与int时一样,但vc不知道怎么回事,处理不一样导致结果会一致。记住就行。
michael2988 2015-02-05
  • 打赏
  • 举报
回复
vs2008 测试没差别
十七岁_ 2015-02-05
  • 打赏
  • 举报
回复
引用 5 楼 ri_aje 的回复:
测试数据发上来看看。
http://www.patest.cn/contests/pat-a-practise/1065
ri_aje 2015-02-05
  • 打赏
  • 举报
回复
测试数据发上来看看。
十七岁_ 2015-02-05
  • 打赏
  • 举报
回复
我已经找到答案了 谢谢各位~

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧