zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    jquery
    模板库
    Luogu P1902 刺杀大使
    8.20模拟赛再次观光记
    Luogu P1122 最大子树和
    Luogu P1470 最长前缀 Longest Prefix
    8.18爆炸记
    Luogu P1388 算式
    Luogu P1103 书本整理
    8.17
  • 原文地址:https://www.cnblogs.com/2020R/p/13159956.html
Copyright © 2011-2022 走看看