最初に思いついたコードがアホすぎた。三角形の辺を昇順にならべて、三平方の定理でチェックしようとしていた。そんなのことしなくても、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; }