ページ 11

moririnn

Posted: 2016年2月13日(土) 22:45
by MORIRIN
入力された10個のうち大きい数字3つを出力しろというものですが配列を用いたアルゴリズムが全くわかりません。どのように考えたら良いのでしょうか。またどう勉強すれば良いですか??

コード:

#include<stdio.h>
 
int main(){
  int a[10];
  int i,j,temp;
  for(i=0;i<10;i++)
    scanf("%d",&a[i]);
  for(i=0;i<10;i++){
    for(j=i+1;j<10;j++)
      if(a[j]>a[i]){
    temp = a[i];
    a[i] = a[j];
    a[j] = temp;
      }
  }
  for(i=0;i<3;i++)
    printf("%d\n",a[i]);
 
  return 0;
}

Re: moririnn

Posted: 2016年2月13日(土) 23:27
by みけCAT
まずインデントを整えましょう。
これは入力を降順にソートして最初の3個を出力する、というプログラムですね。
ソートは今見ている範囲の先頭とそれ以外の要素を比較して先頭より大きい要素があったらそれと先頭を交換する、という処理を行い、
一回終わったら見る範囲から先頭の要素を外して同様に繰り返す、という方法の、O(N^2)のものですね。
scanfで入力を読み込んだつもりになって、実際に読み込めたかどうかをチェックせずに処理を進めているのはよくないですね。

Re: moririnn

Posted: 2016年2月13日(土) 23:37
by box
みけCAT さんが書きました: scanfで入力を読み込んだつもりになって、実際に読み込めたかどうかをチェックせずに処理を進めているのはよくないですね。
まあそれくらいは大目に見てあげましょう。今回の問題の本質的なところではないですから。

コード:

#include <stdio.h>

#define N (10)

int main(void)
{
    int a[N];
    int i, j, temp;

    for (i = 0; i < N; i++) {
        scanf("%d", &a[i]);
    }
    for (i = 0; i < N - 1; i++) {
        for (j = i + 1; j < N; j++) {
            if (a[i] < a[j]) {
                temp = a[i];
                a[i] = a[j];
                a[j] = temp;
            }
        }
    }
    for (i = 0; i < 3; i++) {
        printf("%d\n", a[i]);
    }
    return 0;
}
Nの値をもっと小さく(例えば5とか6とか)にしてみて、自分がコンピュータになったつもりで
1行ずつ実行してみるってのはどうでしょうか。
あと、トランプのカードを数枚程度使ってプログラムのとおりに並べ替えてみるとか。