0

以下のベクトル(配列)の問題を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

どのようにできるのか???タイ

#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

4 に答える 4

2

(1) 数と (2) 出現回数を追跡する方法が必要です。次のように考えてみてください。コンピューターではなく、鉛筆と紙を使って手作業で行っていたとしたら、どのようにしますか?

おそらく、左側の列に数字、右側の列に発生回数が記載された小さな表が書かれた紙が必要になるでしょう。次に、数字(あなたの場合は8、9、8、5、5)を調べ、数字ごとに、それがテーブルにあるかどうかを確認します。すでにテーブルにある場合は、カウントを 1 つ増やします。表にない場合は、カウント 1 で新しい行に配置します。

あとは、このテーブルを紙のテーブルとして実装するのではなく、ある種のデータ構造として実装するだけです。

于 2012-05-23T14:26:50.653 に答える
0

最後のコードは次のように記述します。

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

各入力番号を n 回印刷して、対応する発生を表示するので、印刷機能を変更するだけで問題ないと思います。

于 2012-05-23T14:22:34.400 に答える
0

あなたのコードは正しいです。ループの最後の印刷を変更するだけで、要素が前のものと似ている場合は再度印刷をスキップするという条件を確認するだけです。

for(i=0;i<n;i++)
{
    if(vett1[i+1] == vett1[i])
        continue;
    else
        printf("Number %d %d occurence",vett1[i],vett2[i]);
}
于 2014-07-19T11:39:25.433 に答える
0

各番号を 1 回だけ表示する必要があります。これを実現するには、いくつかの方法があります。

  1. 数値を調べるときはいつでも、まず、配列内でこの数値が最初に出現するかどうかを確認してください。そうでない場合は、無視してください。n 番目の要素を見ると、その前に戻ってすべての要素を調べる必要があるため、非常に非効率的です。

  2. 上記と同様ですが、初回出現検証とカウントを組み合わせます。と の 2 つのネストされたループがiありjます。jループvett1[j] == vett1[i]で where が検出された場合はj<i、これがこの番号の最初の出現ではないことを意味します。それを無視します。これは、現在のソリューションと同じくらい効率的です。

  3. 並べ替え -qsort配列を並べ替えるために使用します。その後、一度だけ調べてください。これで、各数値のすべての出現が次々と発生するため、配列を 1 回渡すだけで簡単に数えることができます。これは最も効率的な方法ですが、少し複雑です。

于 2012-05-23T14:28:10.310 に答える