问题 求两个int值的平均数

1.最初思想

求平均数是一个大家都很常见并且很简单的问题,根据简单的数学计算就能得出。通常的第一想法都是两个数相加再除以2 

即 ave=(a+b)/2;容易得出以下程序

package pingjunshu;

public class Pingjunshu {
	
	int a;
	int b;
	static double ave;
	
	
	static void pingjun(int a,int b){
		ave=(a+b)/2.;
		System.out.println(ave);
		
		
	}	
}

这个式子在解决一些数值并不大的问题时是可以成功的,但是因为int的范围有限,一旦两个数的和过大,超过了int的数值上限,该算法的结果就将为负,无法算出正确的结果。

2.改进两个数过大无法求值的问题

面对以上问题,经过思考后得出,不应该对两个int值进行加或乘运算,因为一旦这两个int值足够大,加或乘运算后得到的结果都将超出int数值上限引起运算错误.所以将算法优化.两个数的平均数等于一个数的二分之一加上另一个数的二分之一。即ave=a/2+b/2

package pingjunshu;

public class Pingjunshu {
	
	int a;
	int b;
	static double ave;
	
	
	static void pingjun(int a,int b){
		ave=a/2.+b/2.;
		System.out.println(ave);
		
		
	}	
	
	
	

}



因为a和b都是int类型所以a和b的二分之一的和必然不会超过int的数值上线,所以并不会出线越界使结果出错的问题.




3.总结

当第一次遇见这种简单问题的时候 很容易因为惯性思维和经验主义而忽略了一些新的知识,产生一些错误。这些错误都很好改正但是最需要改正的是粗心的思考方式.

这个题目的关键就是思考如何避免int值越界问题,最开始想到的就是避免使用加法,所以我当时使用的是ave=a+(b-a)/2

这个式子希望讲加法转换为减法,但是考虑到两个数异号的情况下依然可能出线int越界的情况,所以将式子的减法也化开变成了

ave=a/2+b/2 解决了越界问题 至于别的问题现在我还没有发现.另外对于多个数的平均数这个式子应该也可以推广 即ave=a/n+b/n+...+x/n;