C语言求助

B2095 白细胞计数

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]是被舍弃的样本呢?这样可以吗?


|