首页 > 解决方案 > 如何使我的代码在一行上输入数字,并在其间用空格分隔,并输出非重复数字的平均值?

问题描述

我的代码:

#include <stdio.h>

int main()
{
    int count = 0;

    int size = 0;
    float num[size];

    int i = 0;

    float avg = 0;
    float sum = 0;


    while (scanf("%f",&num) != EOF)
    {
        if ((num[i] != num[i+1]) && (num[i] != num[i-1]))
        {
            sum = sum + num[i];
            size++;
        }
        }
    avg = sum/size;
    printf("%0.2f", avg);
}

我的输入和输出:

//input
2
2
1
^Z
//output
1.67

正确的输入输出:

2 2 1
^Z
1.50

我的问题:

1)如何让我的代码提示在一行上输入数字,每个输入之间用空格隔开?现在,我的代码在输入数字后总是开始一个新行。

2)如何修复我的代码,使其仅计算非重复数字的平均值?(注意:我的代码运行速度必须不低于 O(nlogn)。)所以我不能使用嵌套循环,因为它的运行时间为 O(n^2)。

标签: c

解决方案


您的代码中有一些问题:

  • 的使用num
  • 测试scanf
  • 已使用号码的测试。

的使用num

当你写

int size = 0;
float num[size];

您不分配内存来存储数字。

while (scanf("%f",&num) != EOF)

不正确,因为您没有将读取的值存储到浮点数中:gcc警告:

warning: format ‘%f’ expects argument of type ‘float *’, but argument 2 has type ‘float (*)[(sizetype)(size)]’ [-Wformat=] 

一个更正确的方法是写:

float num; 
...
while (scanf("%f",&num) != EOF)

测试scanf

您测试scanf不返回EOF,但是如果您不提供数字转换失败怎么办?

测试用户给出的正确方法是检查您是否有想要的转换次数:

while (scanf("%f",&num) == 1)

已使用号码的测试。

写作

if ((num[i] != num[i+1]) && (num[i] != num[i-1]))

您将最后一个数字 ( i) 与过去和未来的数字 (?!) 进行对比

你有一个更简单的方法:有一个数组来存储已经得到的数字。这意味着已经获得了测试数字的功能。

警告它的当前实现is_number_in_array非常幼稚,并使您的程序在 O(n) 中运行。您可以轻松地将其替换为 O(log n) 的一些二分搜索


因此,您的代码的更正版本可能是:

#include <stdio.h>

int is_number_in_array(float num, float *array, int size)
{
    for (int i =0; i < size; ++i)
    {
        if (num == array[i])
            return 1;
    }
    return 0;
}

#define MAX_NUMBER 50

int main(void)
{
    /* number of number read */
    int size = 0;

    /* number already read */
    float array[MAX_NUMBER] = {};

    /* currently read number */
    float num = 0;

    float avg = 0;
    float sum = 0;

    /* get next number, stop when a conversion failed */
    while (scanf("%f",&num) == 1)
    {
        /* test if number is already in array */
        if (! is_number_in_array(num, array, size )) {
            /* not in array: add it */
            array[size ++] = num;
            sum += num;
        }

        /* Add some test here to check that size is not as big as MAX_NUMBER */
    }

    avg = sum/size;
    printf("%0.2f", avg);

    return 0;
}

推荐阅读