我正在尝试解决问题,但遇到了一些问题。
我必须找到一系列数字的移动平均值。
示例:
<span class="recent_number"></span>
<ul id="side-recent-area" class="side-recent-area">
<li class="q_basket_area xans-record-">
<div class="q_basket_details displaynone">
<h3 class="q-heading -size-xs">
<a href="/show/board.html##param##">product</a>
</h3>
<ul class="q_basket_info">
<li class="q_basket_name">
<a href="#;" class="displaynone">(eng : )</a>
</li>
</ul>
</div>
</li>
<li class="q_basket_area xans-record-">
<div class="q_basket_details displaynone">
<h3 class="q-heading -size-xs">
<a href="/show/board.html##param##">product</a>
</h3>
<ul class="q_basket_info">
<li class="q_basket_name">
<a href="#;" class="displaynone">(eng : )</a>
</li>
</ul>
</div>
</li>
<li class="q_basket_area xans-record-">
<div class="q_basket_details displaynone">
<h3 class="q-heading -size-xs">
<a href="/show/board.html##param##">product</a>
</h3>
<ul class="q_basket_info">
<li class="q_basket_name">
<a href="#;" class="displaynone">(eng : )</a>
</li>
</ul>
</div>
</li>
<li class="q_basket_area displaynone xans-record-">
<div class="q_basket_details displaynone">
<h3 class="q-heading -size-xs">
<a href="/show/board.html##param##">product</a>
</h3>
<ul class="q_basket_info">
<li class="q_basket_name">
<a href="#;" class="displaynone">(eng : )</a>
</li>
</ul>
</div>
</li>
<li class="q_basket_area displaynone xans-record-">
<div class="q_basket_details displaynone">
<h3 class="q-heading -size-xs">
<a href="/show/board.html##param##">product</a>
</h3>
<ul class="q_basket_info">
<li class="q_basket_name">
<a href="#;" class="displaynone">(eng : )</a>
</li>
</ul>
</div>
</li>
</ul>
虽然我得到了答案,但这是一个问题,但这不是精确的答案。
接受的输出:accuracy difference shown in the image
input 4 2 7
output 4 3 4.3333
我找不到问题所在。我们将不胜感激。
290.6666666667
385.4000000000
487.8333333333
477.4285714286
496.4444444444
...
523.8571166992
506.0454406738
495.3043518066
答案 0 :(得分:0)
这里
for(int i=1; i<=n; i++){ }
您正在尝试访问绑定数组元素之外的内容,这肯定会导致未定义的行为,因为假设n
为5
,那么您正在访问arr[5]
也不存在。
C
不执行数组边界条件检查,它的程序员负责不要访问超出范围的元素,否则会导致UB。
在C
中,数组索引从0
开始,而不是从1
开始。因此最好开始将循环从0
旋转到n
。对于例如
for(int i=0; i<n; i++) {
scanf("%f",&arr[i]);
/* some code */
}
答案 1 :(得分:0)
由于使用float
而不是double
,因此代码无法达到所需的精度。 @Some programmer dude
典型的float
精确到2 23 中的1个部分。要打印到0.0000000001
,最好使用typically precise到2 53 中1个部分的double
。
#include<stdio.h>
int main(void) {
//float arr[n + 1], resarr[n + 1];
//float sum = 0;
double arr[n + 1], resarr[n + 1];
double sum = 0;
...
// scanf("%f", &arr[i]);
scanf("%lf", &arr[i]);
...
// float res = sum / (float) i;
double res = sum / i; // cast not needed as `sum` is `double`
...
}
从1开始迭代在C语言中不是惯用的。更常见的是从0开始进行迭代。
size_t
最适合数组大小调整和索引编制。 int
可能太窄。当然,对于较小的数组,它的作用很小。
#include<stdio.h>
int main(void) {
printf("set:");
size_t n;
scanf("%zu", &n);
double arr[n], resarr[n];
double sum = 0;
for (size_t i = 0; i < n; i++) {
scanf("%lf", &arr[i]);
sum = arr[i] + sum;
double res = sum / (i+1);
resarr[i] = res;
}
for (size_t i = 0; i < n; i++) {
printf("%0.10f\n", resarr[i]);
}
return 0;
}
更健壮的代码将检查用户输入是否有效,如果允许n
较大,则分配而不使用VLA,在读取之前刷新输出,等等。
请注意,不需要数组arr[]
,只需输入一个double
和sum
。