我想出了这个
n=1; curAvg = 0; loop{ curAvg = curAvg + (newNum - curAvg)/n; n++; }
我认为这种方式的重点是: -避免大数(如果求和然后除法,可能会溢出) -保存一个寄存器(不需要存储和)
麻烦可能在于求和错误-但我认为一般来说,舍入和舍入的数量应该是平衡的,因此该误差不会急剧增加。
您在此解决方案中看到任何陷阱吗?你有更好的建议吗?
您的解决方案本质上是“标准”的最佳在线解决方案,用于在不存储大笔费用的情况下保持平均运行轨迹,并且在“在线”运行时也是如此,即,您一次只能处理一个数字,而不必返回其他数字。使用固定数量的额外内存。如果您希望在数值精度方面进行稍微优化的解决方案(以“在线”为代价),则假设您的数字均为非负数,然后从最小到最大先对数字进行排序,然后按该顺序进行处理,您现在使用的相同方式。这样,如果您得到一堆很小的约相等的数,然后又得到一个大数,则与先处理大数相反,您将能够准确地计算平均值而不会发生下溢。