プロが教えるわが家の防犯対策術!

直角三角形の直角をはさむ2辺をa,b(a≦b)とし,斜辺をcとします。a≦100,b≦100で,a,b,cがすべて整数となる組み合わせをすべて出力するプログラムを作りたいんです。

直角三角形ならば1(真),でなければ0(偽)と出るようにすればいいのでしょうか?こうなのかなとかいろいろ考えてると,どんどん頭がこんがらがって(>_<)

A 回答 (4件)

こんな感じでいいんじゃないかと思います


----------------------------------------------------------------
#include <stdio.h>
#include <math.h>

void main(void){
int a,b,c;
int a2,wk;

for(a=1;a<=100;a++){
a2=a*a;
for(b=a;b<=100;b++){
c=(int)(sqrt(wk=a2+b*b)+0.5);
if(wk==c*c){
printf("(a,b,c)=(%d,%d,%d)\n",a,b,c);
}
}
}
}
    • good
    • 0

一つ一つ捜す方法は他の方が書いているので、別の方法を紹介します。


a^2+b^2=c^2となる整数の組合せは、整数i, jを使って
(i^2-j^2, 2*i*j, i^2+j^2)ですべて表すことが可能ですので、これをすべて列挙すればOK
    • good
    • 0

整数演算のみを条件として、


int a,b,c,m,n;
for (a=1;a<=100;a++){
for (b=a;b<=100;b++){
m=a*a+b*b;r=0;
for (c=b;c<a+b;c++){
n=c*c;
if (m==n) {
r=1;
break;
}
else if (m<n) break;
}
printf("r a=%d,b=%d,c=%d\n",r,a,b,c);
}
}

未検証
    • good
    • 0

Cはほとんど知らない素人ですが、単純に考えて…



1. aの初期値=1   →while文?
2. bの初期値=1   →while文?
3. c=√(a^2+c^2)  →sqrt?
4. c=整数か判定
5. c=整数ならa,b,cを出力、整数でなければ6へ
6. bを1増やし、3へ戻ってループ。b=100まで判定したら7へ
7. aを1増やし、2へ戻ってループ。a=100まで判定したら8へ
8. 処理終了


整数の判定の仕方はよく分かりません。
文字列の長さで判定するとか、cを整数に変換したものとcの差が0なら整数と判定するとか、その辺は何とか考えてみてください。

うーん、もっと効率よく出来るのかな?
それとも完全に的外れ?
詳しい方お願いします(^^;
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!