java求两个int类型平均数的正确姿势

JAVA求两个int类型平均数的正确姿势

博主近日正在学习java基础,一天,正在看一本《JAVA从入门到精通》的书,java代码的清香不断飘来,心情愉悦
突然!一个问题进入了我的眼睛:求两个int类型的平均数?
呵,这还不简单吗

  int a;
  int c=(a+b)/2;
  system.out.println(c);  

三行代码,搞定。
如果你真这么想,说明你思维并不严谨,并不具备一个优秀程序员的品质。
为什么这么说呢?

首先,忽略了int的范围问题,int的范围是 [-2^31,2^31-1]

所以当a+b超出这个范围的时候,就并不能得到正确答案
那么该如何解决这个问题呢?
我们可以这么这么实现:

int a=1000000000;
int b=2000000000;
int c=a+(b-a)/2;  //用较小的数 加上 大数减去小数的差除以2

这样便可以避免之前所说的超出范围的问题了
你以为问题就解决了吗?不,事情并没有那么简单!

然后,还需要考虑int类型里的负数情况。

什么?负数不也一样吗,用上面的公式求不就行了….等等,不对,好吧,你说…
没错,如果a,b不同号,那b-a一样可能超出int类型的范围,于是,上面的情况又重现一次。
那么,我们该如何解决这个问题呢?
这就要求我们需要拥有一个很重要的思想,这个思想可以说是一个优秀程序员必 备的思想之一
没错!就是初中数学老师常说的 分类讨论 思想。
在java中的就是用 if语句 实现。
掌握了这个思想之后,我终于写出了求两个int类型平均数的终极代码:

          int a=-1000000000;
          int b=2000000000;
          int c;
          if((a^b)>0){                //判断a,b是同号
              if(a<=b){c=a+(b-a)/2;}  //判断a,b大小
              else {c=b+(a-b)/2;}
          }
          else {c=(a+b)/2;};
          System.out.println(c);

在上面的代码实现中,运用了位运算判断两个数同号或者异号,如果a^b>0,则a,b同号,a^b<0,则a,b异号。这也算是一个小技巧吧。
哈哈,到这里问题终于算是得到了解决,代码的清香飘来,心情愉悦!

你可能感兴趣的:(java)