题目描述:
输入2个整数m和n,写一个函数average,求2个整数的平均值,考虑整数过大溢出的问题。
测试1:
输⼊:10 20
输出:15
测试2:
输⼊:3 4
输出:3
测试3:
输⼊:2000000000 2000000002
输出:2000000001
解法思路:
本题最直观的解法为:两数相加后除以二向下取整。不过因为整数过大时,两数相加会溢出的问题,
需要考虑其他解法。下面给出一种改进后的方法:
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;
}
运行结果: