【问题标题】:How to find the amount of numbers above the average WHILE inputing the numbers?如何在输入数字时找到高于平均值的数字数量?
【发布时间】:2021-10-22 22:10:59
【问题描述】:

这个问题其实很棘手。我们的老师希望我们编写一个程序(用 C 语言),从用户那里获取未知数量的数字(直到用户输入 -1)并计算高于平均值的数字数量在输入数字时。使这项任务变得困难的是我们不允许使用数组这一事实。我试图计算平均值的变化率,并得出一个关于当用户输入某个“大”数字时我们对不再高于平均值的数字数量的猜测的结论,但我没有想到.我只是不知道如何在没有实际将数字保存在某处并在输入最终数字后检查它们的情况下如何编程这个东西。我什至不知道这是否可能。你有什么建议吗?

【问题讨论】:

  • 我很确定你误解了老师,他们在捉弄你,或者他们不了解自己的问题。
  • math.stackexchange.com/questions/106700/incremental-averageing (总之把数字的总和和你目前读过的数字存起来就够了)
  • @SamBob 也许您还没有从头到尾读完这个问题。他们在询问如何在读取每个数字后打印出高于平均水平的 count 个数字。并且不允许他们保存数字。这似乎不可能。
  • 同意之前所有三个 cmets:您只能计算在输入该数字时高于增量平均值的数字。您无法确定高于所有数字最终平均值的数字计数。
  • 我相信老师希望你使用动态分配而不是“普通”数组。

标签: c average


【解决方案1】:

如果不保持与输入数量成比例的信息量,这是不可能的,因此本质上需要数组。

证明:考虑任何 n-1 个输入的序列,然后是最终输入 x。为了说明,假设允许的输入集是有理数。通过选择 x,我们可以将平均值设为任何有理数。 (如果前 n-1 个输入的总和是 s 并且我们希望平均值是 a,那么我们选择 x = an-s。)所以,我们可以选择一个x,它略低于 1 并且略高于 1 1,因此程序必须“知道” 1 是否在先前的输入中,以便它可以包含在计数中。类似地,我们可以选择一个略低于或略高于任何其他数字的 x,程序必须做出相应的响应。因此,程序能够为所有可能的输入产生正确计数的唯一方法是它是否具有所有先前输入的记录。

【讨论】:

  • 为什么需要数组来保存所有输入的信息?考虑到这个问题,无论如何,二叉树可能比数组更好,
【解决方案2】:

相信老师是在教你如何使用malloc家庭功能。

我会这样做:

typedef struct
{
    size_t size;
    int data[];
}data_type;

size_t countAbove(const data_type *data, int val)
{
    size_t count = 0;
    for(size_t i = 0; i < data -> size; i++) count += data -> data[i] > val;
    return count;
}

int getAverage(const data_type *data)
{
    long long sum = 0;
    for(size_t i = 0; i < data -> size; i++) sum += data -> data[i];
    return sum / data -> size;
}

data_type *addData(data_type *data, int val)
{
    size_t newsize = data ? data -> size + 1 : 1;

    data = realloc(data, sizeof(*data) + newsize * sizeof(data -> data[0]));
    if(data)
    {
        data -> data[newsize - 1] = val;
        data -> size = newsize;
    }
    return data;
}

int main(void)
{
    data_type *data = NULL, *tmp;
    int val = 0;

    while(1)
    {
        printf("Enter number: ");
        while(scanf("%d", &val) != 1);
        if(val == -1) break;
        printf("\n");
        tmp = addData(data, val);
        if(tmp) data = tmp;
        else { /* add some error handling*/}
        printf("Numbers above average %zu\n", countAbove(data, getAverage(data)));
    }
    free(data);
}

https://godbolt.org/z/TzzjffbT9

【讨论】:

    猜你喜欢
    • 2017-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多