大数据量下求均值的方法

问:请问在C或C++中如何求N个数的平均值?这N个数直接相加肯定会溢出因为INT类型只有32位有什么好的算法可以求吗?

答:如果要特别精确的话,就要用字符串表示的大整数了,
如果不需要特别精确的话
用double加下面的公式还是比较接近结果的
假设前n个数值的平均值为V(n),第n+1个数为T, 则前n+1个数的平均值为:
V(n+1) = (T - V(n)) / (n + 1) + V(n)

 

另一种类似的思路:

假定是偶数个数字:
1     2     3     4     5     6     7     8
-------------------------------------------- 第一轮计算每两个数的平均值
1.5         3.5         5.5         7.5
-------------------------------------------- 第二轮计算每两个数的平均值
2.5                     6.5
-------------------------------------------- 第三轮计算每两个数的平均值
4.5 <-- 这就是最后的平均值
 
如果是奇数个数字
1     2     3     4     5     6     7     8     9
----------------------------------------------------- 第一轮计算每两个数的平均值,最后一个数字不算
1.5         3.5         5.5         7.5         9
----------------------------------------------------- 第二轮计算每两个数的平均值,最后一个数字不算
2.5                     6.5                     9
----------------------------------------------------- 第三轮计算每两个数的平均值,最后一个数字不算
4.5(权重是8/9)                                  9(权重是1/9)
 
所以平均值 = 4.5 / 9 * 8 + 9 / 9 * 1 = 5  (注意要先除后乘,防止溢出)

转载于:https://www.cnblogs.com/iroultron/archive/2013/06/13/3133973.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值