pat-A1065-A+B and C (64bit)

题目链接->link

题意描述

判断A+B>C,特殊在A,B范围都超出long long int的范围,所以要作溢出判断。

思路

  1. 首先,由计算机组成原理知识,long long int 最大范围为[-263,263-1],因为内存中用补码表示。又因为题目给出A,B范围为[-263,263],(此处右边界应该取不到,因为263补码表示是-263,这样就无法区分左右边界了)故有可能发生正溢出和负溢出。
  2. 正溢出情况下,A+B取[263,264-2],对应long long int截断溢出位后范围位[-263,-2],因为263-264=-263;264-2-264=-2。
  3. 负溢出情况下,A+B取[-264,-263-1],对应long long int截断溢出位后范围位[0,263-1],因为-264+264=0;-263-1+264=263-1。
  4. 还要注意判断溢出时要先用long long int 保存A+B结果。
  5. 取巧的做法可以用long double表示,因为long double范围位为128位,故不存在溢出。

代码

  • 用long long int:
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <iostream>

using namespace std;

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

  • 用long double:
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <iostream>

using namespace std;

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

发布了28 篇原创文章 · 获赞 1 · 访问量 593

猜你喜欢

转载自blog.csdn.net/MichealWu98/article/details/104029021