not good but great

プログラミング、アート、映画・本の感想について書きます。

0003: Is it a Right Triangle?

最初に思いついたコードがアホすぎた。三角形の辺を昇順にならべて、三平方の定理でチェックしようとしていた。そんなのことしなくても、3通りだけ確かめればよかった。

加えてscanf読み込みのエラーに苦しんだ。なぜか最初に入れたNの値が、ソート後N=num[2]になっていた。だからループが正しく終わらなくて困った。scanfを連続して使用すると、改行を読み込んでしまうことは調べてわかったが、それが原因ではないような気がする。最後までよくわかなかった。

最初に書いたコード

#include <stdio.h>
#define LEN 3

int main(){
    int i,j,k,tmp,N;
    int num[2];

    scanf("%d",&N);
    printf("N=%d\n", N);
    for(k = 0;k < N;k++){
        scanf("%d %d %d",&num[0],&num[1],&num[2]);
        for(i = 0; i < LEN;i++){
            for(j = LEN - 1;j > i;j--){
                if(num[j] < num[j-1]){
                    tmp = num[j-1];
                    num[j-1] = num[j];
                    num[j] = tmp;
                }
            }
        }

        printf("%d %d %d\n", num[0], num[1], num[2]);
        printf("N=%d\n", N);
    }
    return 0;
}

原因が分からなかったのでGoogleで調べると、参加者の多くが以下のようなコードを書いていたので書き直すことにした。自分は配列に入れてソートという難しいことをしたので、どこかでscanfの間違いを犯したのだろう。

書き直したコード

#include <stdio.h>

int main(void){
    int i,N;
    int a,b,c;
    int check;

    scanf("%d",&N);

    for(i = 0;i < N;i++){
        scanf("%d %d %d",&a,&b,&c);

        check = 0;

        //三平方の定理
        if(a*a == b*b + c*c)check = 1;
        if(b*b == a*a + c*c)check = 1;
        if(c*c == a*a + b*b)check = 1;

        if(check == 1){
            printf("YES\n");
        }else{
            printf("NO\n");
        }
    }
    return 0;
}