可能产生溢出的几种情况:
两个正数相加;两个负数相加;(同号相加)
正数减负数;负数减正数;(异号相减)
POJ:[编程题]A+B>C?
题目:给定区间[-2的31次方, 2的31次方]内的3个整数A、B和C,请判断A+B是否大于C。
分析:题目中出现了两个运算数相加的情况,根据加减运算可能产生溢出的情况,可以将问题划分为AB同号和AB异号两种情况。
如果AB同号,可能产生溢出;因此做如下处理,
如果AC同号,化A+B>C?为A>C-B?;
如果AC异号,那么如果A为+,则A+B>C(两正数之和大于一个负数);
如果A为-,则A+B<C(两负数之和小于一个正数)
如果AB异号(包括A或B为0的情况),可以直接进行比较A+B和C的大小;
PS:题目中输入会包括2147483648这个不在int类型范围内的数,因此按照此方法会有一些用例无法通过(只是提供一个处理溢出的思路)。源代码如下:
在这里插入代码片
```import java.util.Scanner;
/*给定区间[-2的31次方, 2的31次方]内的3个整数A、B和C,请判断A+B是否大于C。*/
public class Main {
public static void main(String[] args)
{
Scanner sc=new Scanner(System.in);//从控制台输入
int caseNumber=sc.nextInt();//读取用例数量
// String[] result=new String[caseNumber];
for(int i=0;i<caseNumber;i++)
{
int firstNum=sc.nextInt();
int secondNum=sc.nextInt();
int thirdNum=sc.nextInt();
int index=i+1;
System.out.println("Case #"+index+": "+String.valueOf(compareMaxMin(firstNum,secondNum,thirdNum)));
}
/* for(int i=0;i<caseNumber;i++)
{
System.out.println(result[i]);
}*/
}
/*************************
* 比较A+B和C的大小
* @param A 参数1
* @param B 参数2
* @param C 参数3
* @return 返回true或者false
*/
public static boolean compareMaxMin(int A,int B,int C)
{
//问题难点在于输入是一个属于int类型范围的整数
//但是两个整数相加可能会导致溢出的情况
//需要解决溢出问题 同号相加 异号相减
if((A>0&&B>0)||(A<0&&B<0))//A、B同号
{
//C和AB同号
if((A>0&&C>=0)||(A<0&&C<=0))
{
if(A>C-B)
return true;
else
return false;
}
//C和AB异号
else {
if(A>0)
return true;
else
return false;
}
}
else //A、B异号 或者存在A或B=0 0不会造成溢出
{
//直接比较
if(A+B>C)
return true;
else {
return false;
}
}
}
}