1065 A+B and C (64bit) (20分)

假如只有四位,数的取值范围是-8~7(1000~0111),溢出的结果可以用两数相加的结果模2^4,比如7+1=8,0111+0001=1000,求补码得(舍去1)0000,结果为0;7+5=12,0111+0101=1100,求补码得1100,结果为-4,7+3=10,0111+0011=1010,求补码得1110,结果为-6。

可以知道,溢出的结果是正确结果%2^k,k为位数,如:0=0%16,-4=12%16,-6=10%16。

题中数字取值:[-2^63,2^63],所以数字用long long型存储(8字节,64位)

A、B为正数时,能够产生溢出的运算结果范围是[2^63 + 1, 2^64],溢出后的结果范围:[(2^63+1)%2^64, 2^64%2^64],即[-2^63 - 1, 0],如果A+B结果在此范围内,则溢出。

A、B为负数时,能够产生溢出的运算结果范围是[-2^63 - 1, -2^64],溢出后的结果范围:[(-2^63-1)%2^64, 2^64%2^64],即[0, 2^63-1],如果A+B结果在此范围内,则溢出。

用cin读入会导致第三个测试点不通过。

 

 1 #include <iostream>
 2 #include <stdio.h>
 3 using namespace std;
 4 int main()
 5 {
 6     long long A, B, C,res, k;
 7     cin >> k;
 8     bool f;
 9     for (int i = 0; i != k; ++i)
10     {
11         //cin >> A >> B >> C;
12         scanf("%lld%lld%lld",&A,&B,&C);
13         res = A + B;
14         if (A > 0 && B > 0 && res <= 0)//溢出
15             f = true;
16         else if (A < 0 && B < 0 && res >= 0)
17             f = false;
18         else//没有溢出
19         {
20             if (res > C) f = true;
21             else f = false;
22         }
23         if (f)
24             cout << "Case #" << i + 1 << ": true";
25         else
26             cout << "Case #" << i + 1 << ": false";
27         if (i != k - 1)cout << endl;
28     }
29     return 0;
30 }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值