我无法写直方图

时间:2019-11-04 11:47:27

标签: c histogram

我的目的是为重复的数字生成直方图。直到频率大于2为止,代码才能正常工作。

我想我知道代码(第9行)有什么问题,但是我找不到解决该问题的算法。我遇到的问题是,当它写直方图时,它会分离然后再次收集。

我的输入

5
5 6 6 6 7

输出:

6:2 6:2 6:3

但是我需要的输出是

6:3

我有点看问题了,但是我解决不了。

#include <stdio.h>

int main(){

    int array[25];
    int i, j, num, count = 1;

    scanf("%d", &num);

    for (i = 0; i < num; i++) {
        scanf("%d", &array[i]);
        for (j = 0; j < i ; j++) {
            if (array [i] == array[j]) {
                count++;
                printf("%d:%d ", array[i], count);
              }
        }
        array [i] = array[j];

        count = 1;
    }

    return 0;
}

1 个答案:

答案 0 :(得分:1)

您正在尝试在所有单位都被接受之前对出现次数进行计数,除非您为每个值维护一个单独的计数器,否则这是不可能的,如果对输入值范围没有限制或范围是大。

您需要获取所有所有值,然后才能报告任何计数。然后对于数组中的每个值,测试该值是否较早出现,否则,请遍历整个数组以计算出现次数:

#include <stdio.h>
#include <stdbool.h>

int main()
{
    // Get number of values
    int num = 0 ;
    scanf("%d", &num);

    // Get all values
    int array[25];
    for( int i = 0; i < num; i++) 
    {
        scanf("%d", &array[i]);
    }

    // For each value in array...
    for( int i = 0; i < num ; i++) 
    {
        // Check value not already counted
        bool counted = false ;
        for( int j = 0; !counted && j < i; j++ )
        {
            counted = array[j] == array[i] ;
        }

        // If current value has not previously been counted...
        if( !counted )
        {
            // Count occurnaces
            int count = 0 ;
            for( int j = 0; j < num; j++ )
            {
                if( array[j] == array[i] )
                {
                    count++ ;
                }
            }

            // Report
            printf("%d:%d ", array[i], count);
        }
    }

    return 0;
}

对于您的示例输入,结果为:

5                                                                                                                                              
5 6 6 6 7                                                                                                                                      
5:1 6:3 7:1  

可以合并执行countedcount评估的两个内部循环:

    // Count occurrences of current value, 
    bool counted = false ;
    int count = 0 ;
    for( int j = 0; !counted && j < num; j++ )
    {
        if( array[j] == array[i] )
        {
            count++;

            // Discard count if value occurs earlier - already counted
            counted = j < i ;
        }
    }

    // If current value has not previously been counted...
    if( !counted )
    {
        // Report
        printf("%d:%d ", array[i], count);
    }
}