for( k = 0; k < n; k++ )
{
total += total + temps[k];
}
avgTemp = total / n;
temps
是我包含n
元素的数组。avgTemp
将所有值的平均值存储在temps
. k 只是使我的循环工作的一些整数。k、n 和 total 已经在上面某处适当地声明了。total
跟踪数组中元素的总数。
我的锻炼事情告诉我这是错误的。我究竟做错了什么?
这个
for( k = 0; k < n; k++ )
{
/// here's the error.
/// You assign the new value to total as (total = total + total + temps[k])
total += total + temps[k];
}
avgTemp = total / n;
应该
for( k = 0; k < n; k++ ) { total += temps[k]; }
avgTemp = total / n;
或者
for( k = 0; k < n; k++ ) { total = total + temps[k]; }
avgTemp = total / n;
使用迭代求和会更好。它可以避免舍入误差。
avgTemp = temps[0];
for(k = 1 ; k < n ; k++) { total = (temps[k] + (double)(k-1) * total)/ (double)k; }
bames53 还在评论中提供了一个不错的基于 STL 的代码。
第一的,total += temps[k]
+= 表示total = total + temps[k]
已经
顺便说一下,total 是声明为浮点数还是双精度数?否则你正在做一个整数除法。
您的代码在每次迭代中都向自身添加“总计”,这不是您想要的。你需要改变:
total += total + temps[k];
至
total += temps[k];
当获得数字的总和时,您将总数添加到自身,然后添加下一个元素。
total += total + temps[k];
应该:
total += temps[k];
正如bames53 的评论 accumulate
中提到的那样,这确实是您解决此问题的最佳选择。给定n
哪个是容器的大小,it
哪个是指向容器第一个元素的指针或迭代器,您可以对数组、动态分配的数组或向量执行此操作:
const auto avgTemp = accumulate(it, next(it, n), typename iterator_traits<remove_const_t<decltype(foo)>>::value_type{}) / n;