两个整数求平均值很简单?没几个人写对这个代码!

谭浩强C程序设计(第五版)课后答案-视频讲解:求2个整数的平均值

这个题目很多时候是直接求2个整数的平均值。
那这个题目就很简单了,请看如下代码:

//代码1
#include <stdio.h>

int main()
{
	int a = 0;
	int b = 0;
	scanf("%d%d", &a, &b);
	int average = (a + b) / 2;
	printf("avg = %d\n", average);

	return 0;
}

这个是一般的实现方式,请看测试结果:
测试结果1:
在这里插入图片描述
测试结果2:
在这里插入图片描述
测试结果1是正确的,但是测试结果2是错误的。
这里我们发现,代码1还是有一定的问题的!

问题就是:如果求平均数的两个数比较大,如果他们的和超过了整形能表示的最大值,这样就产生了溢出,溢出之后得到的结果也就不是和,不是和就不能求得平均值。

那么此时如果在面试,面试官就会追问,那怎么解决呢?
这里请看一张图:
在这里插入图片描述

看完这张图,我们应该就能明白了,原来代码可以这样写:

#include <stdio.h>
#include <limits.h>

int main()
{
	int a = 0;
	int b = 0;
	scanf("%d%d", &a, &b);
	int average = a + (b - a) / 2;
	printf("avg = %d\n", average);

	return 0;
}

看测试结果:
在这里插入图片描述
看,问题解决了,这就好多了。

升级班

如果面试官这个时候,我们这里不能使用除2的方式呢,代码改怎么改进呢?
其实也不要害怕,我们现在给出代码的2种实现。
实现1:

#include <stdio.h>
#include <limits.h>

int main()
{
	int a = 0;
	int b = 0;
	scanf("%d%d", &a, &b);
	//右移一位有除2的效果
	int average = a + ((b - a) >> 1);
	printf("avg = %d\n", average);

	return 0;
}

实现2:

#include <stdio.h>
#include <limits.h>

int main()
{
	int a = 0;
	int b = 0;
	scanf("%d%d", &a, &b);
	int average = a&b + ((a^b) >> 1);
	printf("avg = %d\n", average);
	return 0;
}

以上2种实现,不是很明白,这里我录制了一个视频,请参考:
C语言求2个数的平均值

好了,这篇文章就讲解到这里,没有提到的,咱们评论区见!

  • 16
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值