ymysleep @ 2022-03-22 18:02:43
#include<stdio.h>
#include<math.h>
int main()
{
int n;
scanf("%d", &n);
double arr[300];
for (int i = 0; i < n; i++)
{
scanf("%lf", &arr[i]);
}
double min = arr[0];
for (int i = 0; i < n; i++)
{
if (arr[i] < min)
{
min = arr[i];
}
}
double max = arr[0];
for (int i = 0; i < n; i++)
{
if (arr[i] > max)
{
max = arr[i];
}
}
double sum = 0;
for (int j = 0; j < n; j++)
{
if (arr[j] != max && arr[j] != min)
{
sum += arr[j];
}
}
double average = sum / (n - 2);
double error = fabs(arr[0] - average);
for (int j = 0; j < n; j++)
{
if (arr[j] != max && arr[j] != min)
{
if (fabs(arr[j] - average) > error)
{
error = fabs(arr[j] - average);
}
}
}
printf("%.2lf %.2lf", average, error);
return 0;
}
20分,题目给的例子也能过,自己看了好久也找不到问题出在哪,谢谢帮忙!
by Maysoul @ 2022-03-22 19:23:51
问题出在这一行
if (arr[j] != max && arr[j] != min)
简单来说,它是去掉最大和最小两个值,而不是去掉最大值和最小值
举个例子
1.0 1.0 2.0 3.0 4.0
这个数列里,会有两个1.0被当做min处理掉
所以你可以在
if (arr[i] < min)
{
min = arr[i];
}
if (arr[i] > max)
{
max = arr[i]
}
这两个地方用变量存储max和min时的i值,然后直接判断j跟这两个值是否相等就行了
by ymysleep @ 2022-04-18 00:28:52
@Maysoul Thank you!
by ID0376 @ 2022-11-20 17:01:56
你过了吗?请问,你为什么可以一开始就令误差为 double error = fabs(arr[0]-average); 如果,arr[0]是被舍弃的样本呢?这样可以吗?