三个整数的平均值

3
我想计算三个数字的平均值,如下所示:
d = int(round((a + b + c) / 3.0))

其中abcd均为整数。

是否可能仅使用整数获得相同的结果?

我对此很感兴趣,因为出于性能原因,我认为使用整数进行计算应该比使用浮点数更快。

上面的示例将整数转换为浮点数,计算结果,四舍五入并将其转换回整数。是否有可能避免int<->float转换?


1, 1, 2 的平均值是多少?你想要什么积分结果? - mmmmmm
a、b、c是整数吗? - nicholas
@Mark:1,1,2 -> 1;1,2,2 -> 2 - Ecir Hana
4
请注意,在今天的个人电脑上,由于优化后的浮点运算单元,性能差异将会非常小 - 如果还有的话。 - Aaron Digulla
4个回答

9

如果要满足 1, 1, 2 -> 1; 1, 2, 2 -> 2 的要求,可以使用整数除法。

使用 // 表示整数除法,n 表示元素个数。

average = ( a+ b + c + .... + n//2 ) // n

将所有的值相加,然后添加一个数字来处理四舍五入。

正如@Henrik所指出的那样,这假设所有的数字都是正数。


是的,这些数字都是正数。谢谢! - Ecir Hana

3

(a + b + c + 1) / 3

解释:如果 (a + b + c) % 3 == 1,则向下取整;如果 (a + b + c) % 3 == 2,则向上取整。

至少对于 a + b + c >= 0 这种情况可以使用。您可能需要单独处理负数的情况。


2
Mahmoud的答案的变体,仅使用一个除法:
d = (((a+b+c) * 10) + 15) / 30

1

应该就是这么简单:

d = (((a+b+c) * 10) / 3 + 5) / 10;

这个网站最近怎么了?为什么所有这些人都像法官和陪审团一样,决定什么是评论,什么不是评论,却没有自己提供任何有价值的东西? - duffymo
@duffymo 谢谢你的点赞,我简直不敢相信自己给出了正确答案却遭到了反对票!其他的答案都是根据这个答案衍生出来的,通过乘以一个因子或者用N代替3来表示元素的数量。 - Mahmoud Fayez
我仍然认为整个想法是错误的,但这并不是打压那些出于善意行事的人的好理由。在我看来,这是一个构思不周的问题。我已经受够了这些无用的评论者。 - duffymo
-1 是因为答案没有解释为什么或者它是否有效,无论回答是否出于善意都不重要。我们的目标是提高这里问题和答案的质量。而我的答案绝对不是从这个中得出的。 - mmmmmm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接