溢出避免:求平均数

好久不见……
这次来说说求平均数的问题。

问题很简单,就是求 (a+b)/2。
当然,我不是让你直接printf(“%d”,(a+b)/2); 这样随便一个人学一小时C语言就可以做到。
问题是 a+b 如果溢出了怎么办?溢出的话就得不到正确结果了,这样该怎么解决?
如果简单的避免溢出,将程序改成 a/2+b/2,这样也是不对的,这样会在a,b都为奇数时导致缺失。
还有人会给出 a+(b-a)/2,其实这种办法也是治标不治本,因为加和减是一样的,既然加法会溢出,那么同样,减法也会溢出,所以这种办法也是没有意义的。

说说我的想法吧,首先举个例子: (193+235)/2,对这两个数,我们已知计算时会发生上溢出,所以可以尝试 a+(b-a)/2这个公式,但是这个公式仅适用于减法不会下溢出的情况下。虽然这个公式并不是正确的,但是我们可以从公式中得到一些东西:
(193+235)/2 => (193+193+42)/2 => 193+(42)/2
其中,42就是235-193
我们可以把193+(42)/2看作是193+(42+0)/2,也可以看作是192+(43+

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值