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 }

 

上一篇:[FAQ] golang-migrate/migrate error: migration failed in line 0: (details: Error 1065: Query was emp


下一篇:PAT(A)1065 A+B and C (64bit)