计算C数组中出现的数字(向量)

时间:2012-05-23 13:55:12

标签: c loops for-loop vector

我正在尝试用C中的向量(数组)实现以下问题的解决方案。 我想输入一个数字和它发生的次数。

这是一个例子:

Imput n:  5

Imput num 1: 8
Imput num 2: 9
Imput num 3: 8
Imput num 4: 5
Imput num 5: 5

该程序现在将显示:

Number 8: 2 occurences
Number 9: 1 occurences
Number 5: 2 occurences

但我的节目:

Number 8: 2 occurences
Number 9: 1 occurences
Number 8: 2 occurences
Number 5: 2 occurences
Number 5: 2 occurences

我该怎么办? TY

#include <stdio.h>
#include <stdlib.h>
#define SIZE 20

int main ()
{
    int vett1[SIZE], vett2[SIZE];
    int n, i, j;
    int flag;

    printf ("Imput n: ");
    scanf  ("%d", &n);

    for (i=0; i<n; i++)
    {
        printf ("Imput %d di %d: ", i+1, n);
        scanf  ("%d", &vett1[i]);
    }

    printf ("\n\nYour vector: : ");

    for (i=0; i<n; i++)
    {
        printf ("%d ", vett1[i]);
    }

    for (i=0; i<n; i++)
    {
        flag=0;

        for (j=0; j<n; j++)
        {
            if (vett1[j] == vett1[i])
            {
                flag++;
            }
        }

        vett2[i] = flag;
    }

    printf ("\n\n");

    for (i=0; i<n; i++)
    {
        printf ("Number %d: %d occurencese\n", vett1[i], vett2[i]);
    }

    return 0;
}

4 个答案:

答案 0 :(得分:2)

您需要一种方法来跟踪(1)数字,以及(2)出现次数。想象一下:如果你是手工制作,用铅笔和纸,而不是用电脑,你会怎么做?

你可能需要一张纸上面有一张小桌子,左栏中有数字,右栏中有出现的数字。然后,您将查看数字(在您的情况下为8,9,8,5,5),对于每个数字,您将检查它是否在您的表中。如果它已在表中,则将计数递增1。如果不在表格中,请将其放在新行上,计数为1。

现在你需要做的就是将这个表实现为不是纸上的表,而是实现某种数据结构。

答案 1 :(得分:0)

你的上一段代码写道:

for (i=0; i<n; i++)
{
    printf ("Number %d: %d occurencese\n", vett1[i], vett2[i]);
}

你在每个输入数字上打印n次以显示相应的出现次数,所以我认为你只需要更改打印输出功能即可。

答案 2 :(得分:0)

您希望仅查看每个号码一次。有几种方法可以实现这一目标:

  1. 每当您检查一个数字时,首先要查看它是否是数组中第一次出现这个数字。如果没有,请忽略它。非常低效,因为在查看第n个元素时,您需要返回并检查它之前的所有元素。

  2. 与上述类似,但将第一次出现验证与计数结合起来。您有两个嵌套循环,ij。如果j循环看到vett1[j] == vett1[i] j<i,则表示这不是此数字的第一次出现。忽略它。这与您当前的解决方案一样高效。

  3. 排序 - 使用qsort对数组进行排序。然后再过一次。现在每个数字的出现都是一个接一个,所以你只需要一次传递数就可以很容易地计算它们。这是最有效的方式,但有点复杂。

答案 3 :(得分:0)

您的代码是正确的,您只需要修改上一次打印循环,只需检查那里的条件,如果该元素与之前类似,则再次跳过打印。

for(i=0;i<n;i++)
{
    if(vett1[i+1] == vett1[i])
        continue;
    else
        printf("Number %d %d occurence",vett1[i],vett2[i]);
}