加减运算产生溢出的情况(A+B>C?)

可能产生溢出的几种情况:

两个正数相加;两个负数相加;(同号相加)
正数减负数;负数减正数;(异号相减)

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;
			}
		}
	}
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值