【问题标题】:Average of 3 numbers using integers使用整数的 3 个数字的平均值
【发布时间】:2012-08-10 11:55:53
【问题描述】:

我想计算三个数字的平均值,例如:

d = int(round((a + b + c) / 3.0))

其中abcd 是整数。

仅使用整数是否可以得到相同的结果?

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

上面的例子将整数转换为浮点数,计算结果,四舍五入并转换回整数。是否可以避免 int float 转换?

【问题讨论】:

  • 1,1,2 的平均值是多少?你想要什么积分结果?
  • 是以 a,b,c 开头的整数吗?
  • @Mark: 1, 1, 2 -> 1; 1, 2, 2 -> 2
  • 请注意,在当今具有优化 FPU 的 PC 上,性能差异将可以忽略不计 - 如果仍然存在的话。

标签: math floating-point integer average


【解决方案1】:

给定 1, 1, 2 -> 1 的要求; 1, 2, 2 -> 2 那么这可以使用整数除法来完成。

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

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

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

正如@Henrik 的回答中所述,这假设所有数字都是正数。

【讨论】:

  • 是的,数字是正数。谢谢!
【解决方案2】:

(a + b + c + 1) / 3

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

至少这应该适用于a + b + c >= 0。您可能需要单独处理负值。

【讨论】:

    【解决方案3】:

    Mahmoud 答案的变体,仅使用一个除法:

    d = (((a+b+c) * 10) + 15) / 30
    

    【讨论】:

      【解决方案4】:

      应该就这么简单:

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

      【讨论】:

      • 这个网站最近有什么问题?为什么所有这些人都充当法官和陪审团,决定什么是评论,什么不是评论,而他们自己却没有提供任何有价值的东西?
      • @duffymo 感谢您的支持,因为我不敢相信自己给出了正确的答案并取消了投票!所有其他答案都是通过乘以一个因子或用 N 替换 3 来从这个答案衍生出来的。
      • 我仍然说整个想法是错误的,但这不是拒绝任何善意行事的人的好理由。在我看来,这是一个构思不佳的问题。我厌倦了这些无用的评论者。
      • -1 因为答案没有解释为什么或它是否有效——无论回复是否善意——我们的目标是提高这里的问答质量。而我的回答绝对不是由此而来的。
      猜你喜欢
      • 2014-07-19
      • 1970-01-01
      • 2021-05-18
      • 1970-01-01
      • 1970-01-01
      • 2017-03-03
      • 1970-01-01
      • 1970-01-01
      • 2018-09-26
      相关资源
      最近更新 更多