题目描述
输⼊2个整数m和n,写⼀个函数average,求2个整数的平均值,考虑整数过⼤溢出的问题。
解法思路
本题最直观的解法为:两数相加后除以⼆向下取整。不过因为整数过⼤时,两数相加会溢出的问题,
需要考虑其他解法。下⾯给出⼀种改进后的⽅法:
1. 两数本⾝和两数的平均数不会溢出,考虑平均数与其中⼀个数的差:(x+y)/2-x=(y-x)/2;
2. 要求得 (x+y)/2,我们可以先求得 x 与 (y-x)/2,然后求得他们的和即可;
3. x 与 (y-x)/2 在计算过程中都不会溢出,因此这个⽅法成⽴。
解法代码
#include <stdio.h>
//⽅法1:这种⽅式数字太⼤是会溢出
int average(int x, int y)
{return (x + y) / 2;
}
//⽅法2:改进
int average(int x, int y)
{return x + (y - x) / 2;
}
int main()
{int m = 0;int n = 0;//输⼊scanf("%d %d", &m, &n);//求平均值int avg = average(m, n);//输出printf("%d\n", avg);return 0;
}
运行结果
输入:
5545 10001
输出:
7773