PAT(A)1065 A+B and C (64bit)

题目链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805406352654336

思路:
cin和scanf输入的区别:cin输入一个溢出的数值时读入到变量内的是变量所能存储的最大值,而scanf则会将溢出后变量大小位置所能存储的数值
本题利用溢出来判断A+B与C的关系
long long 存储范围为[-263,263)
先讨论 A,B!=263情况
如果A>0,B>0出现溢出,A+B范围为[263,264-2],溢出后long long 范围所能存储的数值为[263,264-2]%264=[-263,-2]
如果A<0,B<0出现溢出,A+B范围为[-264,-263),溢出后long long 范围所能存储数值为[-264,-263)%264=(-263,0];
编码后通过所有测试数据,证明没有出现263情况
当然对于Java 和python 情况,代码如下
代码:

c++

#include<bits/stdc++.h>

using namespace std;

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

java

import java.util.*;
import java.math.*;
import java.io.*;
public class Main{
    public static void main(String[] args){
        Scanner scin=new Scanner(new BufferedInputStream(System.in));
        int n=scin.nextInt();
        for(int i=1;i<=n;i++){
        String sa=scin.next();
        String sb=scin.next();
        String sc=scin.next();
        BigInteger numa=new BigInteger(sa);
        BigInteger numb = new BigInteger(sb);
        BigInteger numc = new BigInteger(sc);
        BigInteger num=numa.add(numb);
           // System.out.printf("1");
            if(num.compareTo(numc)==1)System.out.printf("Case #%d: true\n",i);
            else System.out.printf("Case #%d: false\n",i);
           // System.out.println(numa);
        }
    }
}

python

n=int(input())

for i in range(n):
    ans,bns,cns=input().split(" ")//通过空格隔开的连续三组输入
    a,b,c=int(ans),int(bns),int(cns)
    res="Case #"+str(i+1)+": "
    if a+b>c:
        res+="true";
    else:
        res+="false";
    print(res)
上一篇:1065 A+B and C (64bit) (20分)


下一篇:【P1313 [NOIP2011 提高组] 计算系数】题解