2017-02-27 11 views
0

私は最近Cの学習を始めましたが、この小さなテストに遭遇しました。配列内で最も頻繁に見つかる数字

ユーザーから10の数字を読み取るコードを作成します。

最大値を印刷&最も小さい数値を入力してから印刷します。

私はすべてがシンプルでしたが、最も頻繁な数字が私を夢中にさせていました。私はしばらく検索しましたが、明確な答えは見つかりませんでした。

コードは、私が考えるだけのアイデアだった

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    int hi[10], i=0, largest, smallest; 
    while(i<10) 
    { 
     printf("Enter a number:"); 
     scanf("%d", &hi[i]); 
     i++; 
    } 
    smallest = hi[0]; 
    largest = hi[0]; 
    printf("Entered Numbers: "); 
    while(i!=0) 
    { 
     if(hi[10-i] < smallest) { smallest = hi[10-i]; } 
     if(hi[10-i] > largest) { largest = hi[10-i]; } 
     printf("%d | ", hi[10-i]); 
     i--; 
    } 

    printf("\nLargest number is = %d || Smallest number is = %d", largest, smallest); 
    return 0; 
} 

書いた:

  • は別の配列を作ります。

  • 元の配列の[i]の値を取得しています。

  • [i]と元の配列の残りの値(等しいかどうか)を比較します。

  • 等しい場合は、他の配列の値をインクリメントします。

  • 他の配列の中で最も大きな値を確認します。最も高い値です。

  • ここでは、最も頻繁な要素の順序とその要素が何回入力されたかを知っています。

+0

@Vittorio Romeo:そうです、それはOPが既に解明した解決策のようです。それは私には分かりやすいようです。 – doynax

+0

ここに提供されているソリューションをご覧ください:http://stackoverflow.com/questions/26566265/frequency-of-numbers-in-a-1d-array –

+0

配列をソートします。その後、forループ内のhi [0] .. h [9]から配列内の項目を列挙します。その後、余分な変数を使用して重複カウントを追跡します。 – selbie

答えて

3

ハッシュマップを使用する方が効率的です。そこでは、入力番号をキーとして使用して値を1に設定することができます。新しい番号がユーザーから与えられたときは、新しい番号が既にマップに入っているかどうかを確認するだけです。そうでなければ、値を2に設定します。それ以外の場合は、値1を付けて新しい番号を追加します。

+1

このようなスキームは、10要素にかなり複雑さと制限された利益を追加すると思います。それでも、大きな問題には十分に合理的です。 – doynax

+0

はい、まったく正しいです。しかし、私はこれが "現実世界の問題"ではないと思う。プログラミングを学ぶだけです。そして、hashmapへのヒントは、このデータ構造について何かを学ぶのが良いです;) – Markus

+0

hashmapはこれまで私が聞いたことがないか、または会ったことのないものです。 私が前進するにつれて、新しいものを学ぶことも私にとって重要です。私はそれをチェックします。ありがとう! – benjaminwright

1

Markusによると、ハッシュマップは普遍的な解決には理想的です。したがって、漸近時間を抑えることができますしかし、あなたは10の配列しかしていないので、周波数を格納するために2D配列を使用するとうまくいくでしょう。

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    int hi[10][2], i=0,j=0,largest, smallest; 

    while(i<10) 
    { 
     printf("Enter a number:"); 
     scanf("%d", &hi[i][0]); 
     i++; 
    } 
    smallest = hi[0][0]; 
    largest = hi[0][0]; 
    printf("Entered Numbers: "); 
    while(i!=0) 
    { 
     hi[10-i][1] = 0; 
     if(hi[10-i][0] < smallest) { smallest = hi[10-i][0]; } 
     if(hi[10-i][0] > largest) { largest = hi[10-i][0]; } 
     printf("%d | ", hi[10-i][0]); 
     i--; 
    } 
    int most_freq = 0; 
    for (i = 0; i < 10; i++){ 
     for (j = 0; j < 10; j++){ 
      if(hi[i][0] == hi[j][0]){ 
       hi[i][1]++; 
       if (hi[i][1] > most_freq){ 
        most_freq = hi[i][0]; 
       } 
      } 
     } 
    } 

    printf("\nLargest number is = %d || Smallest number is = %d", largest, smallest); 
    printf("\nMost frequent is = %d\n", most_freq); 
    return 0; 
} 
+0

コードの画像を投稿しないでください。代わりにコードを_as形式のテキスト_を投稿してください。 – ForceBru

+0

将来、私の謝罪を行います。 – kr1tzb1tz

+3

2次元配列は実際には必要ありません。 'hi [i] [0]'と 'hi [i] [1]'の代わりに 'hi [i]'と 'count [i]'を使うことで、2つの配列を使う方がはっきりします。 – anatolyg

関連する問題