怎样正确求两个数的平均值?

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shanghx_123/article/details/78463530

1.先来看一个例子:

int main()
{
    int a,b,aver;
    scanf("%d %d",&a,&b);
    aver=(a+b)/2;
    printf("%d",aver);
    return 0;
}

写出这个程序后,大家可能会说这个程序输出的平均值不准确,小数点后都的数都没有,好了,这时我们如果把int换为我们想要的其他的类型,此问题就可以解决;但这个程序还存在一个很严重的问题,就是大数越界的情况。
如果我们求两个非常大的数的平均值,这两个数想加之后刚好就大于我们所定义类型(不一定是int)的最大值,此时的这个程序就会出错,计算的结果就不对,所以我们要想另外的办法来求两个数的平均值,并且在不越界的情况下完成。看下面代码:

int main()
{
int a,b,aver;
scanf("%d %d",&a,&b);
aver=(a-b)/2+b;
printf("%d",aver);
return 0;
}

好了,上面的代码就完全可以解决越界的问题;我们来看下它是怎么完成的;

1.我们先假如a>b;a-b就是两个数的差值,之后取它的一半,再把它加给小的那个数,此时的值就是两个数的平均值;图中红色部分就是a-b的值,绿色部分是(a-b)/2的值,很明显,通过这样运算之后就可以求出aver得值,如果我们假设a的值就是int类型中最大的值,那么它不能再加灵位一个数了,否则就会越界,所以,如果让它减去另外一个数b,此时a-b的值一定肯定不会越界,之后用小的数b加上它们差值的一般就是ever的值,所以就巧妙的解决了这个问题。
2.如果b>a;那么aver=(a-b)/2+b还是会成立,只不过此时a-b的值就是个负数,大数加一个负数就相当于这个数减去差值的一半,所以此方法很有用。

猜你喜欢

转载自blog.csdn.net/shanghx_123/article/details/78463530
今日推荐