问题 求两个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;