• ベストアンサー

たぶん初歩の問題ですが。。。

短大のプログラミングの授業で、問題が出されました。 『斜辺の長さが50以下で、3辺の長さがすべて整数の直角三角形となる場合は何通りあるかを計算させる処理を書きなさい。ただし、同じ数値の順番だけが違うものは一通りとします。 ヒント:Cを斜辺とする三角形A、B、Cは次の条件を満たしています。     Aの2乗+Bの2乗=Cの2乗 (2乗の書き方が分かりませんでした。ごめんなさい) 50以下のすべての3つの正の整数の組み合わせについて、この式が成り立っているかどうかを調べる。同じ数値の順番だけが違うものを除くにはどうすればよいかを考えてください。』 という問題なんですけど、ぜんぜん分からないんです(><)汗汗 いくら考えても、どう考えていいか全然分かりません。。。 プログラミング超初心者なんですけど、誰か教えて下さい!!

質問者が選んだベストアンサー

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.5

前の解答より単純な解き方が出来ました。 「’」は注釈です。 このままPrivate Sub以下をVBE画面に コピーすれば良いと思います。 Private Sub Form_Click() '1から50までの2乗数を配列s(1)からs(50)に '持ちます。 Dim s(51) As Integer u = 0 '解答数 For i = 1 To 50 s(i) = i * i Next i ' 縦横2次元の表を考えてください. '縦にs(i)の数を並べ、横にも 's(i)の数を並べた表を考えてください。 '縦のi番目にある数a(i)(=aの2乗)と横の番目に 'ある数s(j)(=bの2乗)を考えます。 'この和をs(i)+s(j)=tとすると、tはs(1)からs(50)の '中にあるはずです。 'tの計算は For i = 1 To 50 For j = 1 To 50 t = s(i) + s(j) '---- For k = 1 To 50 If t = s(k) Then ’tが平方数の配列に見つかるか Form1.Print "a power(2)="; s(i), Form1.Print "b power(2)="; s(j), Form1.Print "c power(2)="; t u = u + 1 End If Next k '------- Next j Next i Form1.Print "-----" Form1.Print u ' u=40組ですからダブりで数えているので、20通りが解答です。 End Sub

megukko
質問者

お礼

回答本当に有難うございました!! なんとか分かりそうです(^ー^)☆☆ よーく考えてみてます。ありがとうございました!!!

その他の回答 (4)

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.4

サンプルを作りました。 斜辺以外の2辺を、[i/j]のループカウンタの値を使用しています。 iが1~50 jが1~50 のループにしてしまうと i = 3 ; j = 4 i = 4 ; j = 3 となってしまうので、 iが1~50 jがi~50 のループとしています。 これによって、データの重複が存在しなくなります。 > If lngMaxLimit < lngCalc Then >   Exit For > End If というのは、斜辺のべき乗の最大値(この問題の場合は2500)を超えるような斜辺の時は、Jカウンタのループを抜ける処理になってます。 > sngCalc = lngCalc ^ 0.5 > lngWork = sngCalc というのは、i/jより算出した斜辺の値に平方根の処理をおこない、変数sngCalcに代入されます。 それを小数点以下を切り捨て、変数lngWorkに代入してます。 この切り捨て前・後が同じ値であれば、斜辺は整数であると言えます。 Sub Main()   Dim lngMaxHypotenuse  As Long '斜辺の上限   Dim lngMaxLimit     As Long '斜辺の上限のべき乗      Dim lngCalc As Long   '斜辺以外のべき乗どうしを加算した時の値、計算ワーク   Dim sngCalc As Single  '斜辺以外のべき乗どうしを加算した時の値を平方根にかけたもの、計算ワーク   Dim lngWork As Long   'sngCalcで得た値の、小数点以下切り捨てした値         Dim i    As Long 'Iループカウンタ   Dim j    As Long 'Jループカウンタ      Dim ansCount  As Long   '見つかった回答件数   Dim ansStr()  As String  '回答を収める配列      Dim strOutPut  As String  '回答を出力する文字列      '回答の初期化   Erase ansStr   ansCount = 0      '斜辺MAX値   lngMaxHypotenuse = 50   '斜辺2乗の値を超えることはありえないので、上限をセット   lngMaxLimit = lngMaxHypotenuse ^ 2      For i = 1 To lngMaxHypotenuse     For j = i To lngMaxHypotenuse       'このときの斜辺のべき乗の値を求める       lngCalc = (i ^ 2) + (j ^ 2)              'もし斜辺の2乗の値が上限を超えたら、Jカウンタのループを抜ける       If lngMaxLimit < lngCalc Then         Exit For       End If              '斜辺のべき乗から平方根により、斜辺の値を求める       sngCalc = lngCalc ^ 0.5              'ロング型の変数にセットする(この時斜辺の値に小数点以下が存在するとき、切り捨てられる)       lngWork = sngCalc              '小数点以下を切り捨てする前と、切り捨てた後が同じ値ならば、整数値の3辺である       If (lngWork = sngCalc) Then         ReDim Preserve ansStr(ansCount) As String         ansStr(ansCount) = i & " / " & j & " → " & lngWork         ansCount = ansCount + 1       End If     Next j   Next i   '答えの出力   If ansCount > 0 Then     strOutPut = Join(ansStr, vbNewLine)   Else     strOutPut = "斜辺は求められませんでした。。。"   End If   MsgBox strOutPut End Sub

megukko
質問者

お礼

おお!!なんか、長々と書いて頂いてしまって、申し訳ないです!!(><)っっ本当に有難うございました!!なんか申し訳ないんですけど、初心者なんで、まだ習ってない文字とかがいっぱいで、よく分からなかったです。。。でも、回答をもとに、よく考えてみますね。ありがとうございました!!

回答No.3

3重のループを使えば良いです 1番最初のループは、1から50まで、これが斜辺になります。---(1) 2番目のループは、1から(1)未満まで、((1)が斜辺なので1番長いです。)---(2) 3番目のループは、1から(2)以下までループさせて、----(3) それそれ、(2)^2+(3)^2=(1)^2を満たすものの数を数えれば出てきます。 こうすれば、各組み合わせ1度ずつ出てきます。 また、高速化のために、下記の方のヒントを利用し、 (2)^2+(3)^2が(1)^2より大きくなると(3)のループを抜ける等してください。

megukko
質問者

お礼

本当にありがとうございました!! 基礎が出来てないから、じっくり考えてみないと分かりそうもないんですけど、 回答をもとに、じっくり考えてみる事にします!!ありがとうございました!!

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.2

すいません。題意の読み取りを誤りました。 > 同じ数値の順番だけが違うものを除くにはどうすればよいかを 出てきた答え(A,B,C)の順序を問わないということなので 各辺の値を昇順または降順に整列してから比較してみてください。

megukko
質問者

お礼

また、わざわざありがとうございました!! 参考にしてみます。

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

ヒント  三角形のある一辺は他の2辺の計より短い。 (そうでなければ閉じた図形にならない)

megukko
質問者

お礼

どうも、ほんとうに有難うございました!!! なんか、とても早く回答して頂いたみたいで(^O^) これをもとに良く考えてみますね!!!

関連するQ&A

  • 直角三角形に関する問題がわかりません

    「直角三角形において,直角をはさむ2辺の長さの和が一定なら,どんな形の三角形の斜辺が最も短くなるか?」 という問題でつまづきました. (考え)直角をはさむ2辺の和をb,そのうちの1辺をaとすると 斜辺^2=a^2+(b-a)^2 =2a^2-2ab+b^2 長さが負にはならないので 斜辺=√2a^2-2ab+b^2(√以下はすべて√のなか) よって2a^2-2ab+b^2が最小になるときを考えればよい. 2a^2-2ab+b^2=Pとおく P=2(a-b/2)^2+b^2/2 よってa=b/2のとき,Pは最小値をとる, よってこの直角三角形の,直角をはさむ2辺の長さは等しいので, 直角二等辺三角形 この解き方だと解けます. しかし,次の解き方ではできないので,何故できないのかを教えてください. (解)直角をはさむ2辺の和をb,そのうちの1辺をaとすると 斜辺^2=a^2+(b-a)^2 長さが負にはならないので 斜辺=√a^2+(b-a)^2(√以下はすべて√のなか) よってa^2+(b-a)^2が最小になるときを考えればよい. Q=a^2+(b-a)^2とする. Q=(b-a)^2+a^2 よってb=aのとき,Qは最小値をとる. これだとおかしい

  • 直角三角形

    直角三角形の直角をはさむ2辺をa,b(a≦b)とし,斜辺をcとします。a≦100,b≦100で,a,b,cがすべて整数となる組み合わせをすべて出力するプログラムを作りたいんです。 直角三角形ならば1(真),でなければ0(偽)と出るようにすればいいのでしょうか?こうなのかなとかいろいろ考えてると,どんどん頭がこんがらがって(>_<)

  • 数学の問題です。解答お願いします。

    問題 図のような、∠Aが直角の△ABCで、辺BC,CA,ABの長さを それぞれa,b,cとする。 このとき、次の問いに答えよ。 (1) a b cの間にどんな関係が成り立つか。 (2) 斜辺BCに対する高さADをa b c で表せ。

  • 中学の三平方の定理教えて下さい

    直角三角形の直角をはさむ2辺の長さをa,b,斜辺の長さをcとする。 2辺の長さが次のようなとき残りの辺の長さはいくらになるか。 a=5cm c=8cm この問題の答えを教えて頂けませんか? また解き方についてなのですが、 このタイプの問題は a二乗+b二乗=c二乗の三平方の定理公式を利用して計算をすればよいのですよね? この問題の場合、残りの辺の長さ=bの長さという事でいいのでしょうか? 私の考えが間違っていなければ、 答えは√39cmか6cmだと思うのですが、 看護学校を受験するため、数学を勉強しなおしています。 独学な上に看護学校の問題には解答がなく本当に困っています。

  • 三平方の定理

    直角をはさむ2辺の長さがa,b、斜辺の長さがcの直角三角形がある。 この直角三角形の内接円の半径rとしたとき、rはa,b,cを用いて2通りの表し方ができ、この事を利用して三平方の定理(a^)+(b^)=cが成り立つことを証明する問題で 図は高さがa底辺b斜辺ガcです ○(a-r)+(b-r)=c これはどこから表されたのですか?

  • 三平方の定理の逆

    三平方の定理は直角三角形の斜辺以外の二辺をa,bとしたとき 残った斜辺cが a^2+b^2=c^2 で求められるという公式ですが 逆の「a^2+b^2=c^2なら直角三角形である」の証明はどうやってやるのでしょう?

  • 三角関数の基礎ですが

    お世話になります。直角三角形の各角をA,B,CとしたときにBをθ(仮に15°とします)Cを直角としてAB間の斜辺がわかる(仮に40ミリとします)場合に対辺AC間の値を出す公式を教えて下さい。数値は常に変わるので公式が知りたいです

  • 直角3角形と一次不等式

    <か≦か判断できないので質問します。 3辺の長さがそれぞれ2桁の整数である直角3角形がある。今斜辺の長さは他の1辺の長さの一の位と十の位の数字をいれかえた数であるとする。このとき、この3角形の3辺の長さを求めよ。 a,bは1,2,3,・・・,9のいずれかで、a>bとし、斜辺を10a+b,直角をはさむ1辺を10b+a,残りの辺をc(整数)とすると c^2+(10b+a)^2=(10a+b)^2,c^2=(10a+b)^2-(10b+a)^2, c^2=9*11*(a+b)*(a-b) a>bより、ここがわからない箇所です 0<a-b<a+b<17・・・(1) 自分はa=9かつb=8のとき直角3角形ができると思い。0<a-b<a+b≦17だと思ったのですが、ひょっとしたら、2辺の和は1辺より長いの条件などにより、a=9かつb=8にならないのかとも思い、自分の考えが正しいかどうかわかりません。本の記述(0<a-b<a+b<17)があっていたらその理由を教えてください。お願いします。問題の続きをすこし書くと、 c^2は完全平方数だから、(a+b)*(a-b)は11の倍数でないといけない。条件(1)よりa+b=11でa-bは完全平方数。 a-b=1,4,9を代入し連立方程式を解いて、a,b,cを求めています。答えは65,56,33です。

  • 整数部分、小数部分の問題です。

    a=√5+√2、b=√5-√2とするとき  a2乗-b2乗=□ 、ab=□である。 □<2√10<□+1であるから、a/bの整数部分をn、小数部分をcとするとき n=□、3c-5/c=□である。  (入試過去問題) ※整数、小数部分の計算で分数が入ったとき、マイナスが入ったとき(3/4√5とか-2√7など) 解けなくなります。 ご教授願います。

  • 高一の数学の問題

    (1)12の5乗が2のn乗で割り切れるような最大の整数nを求めよ。 (2)aの2乗-bの2乗=8を満たす正の整数a、bの組をすべて求めよ。 上の2問の解答をよろしくお願いします。

専門家に質問してみよう