短大のプログラミングの授業で、問題が出されました。
『斜辺の長さが50以下で、3辺の長さがすべて整数の直角三角形となる場合は何通りあるかを計算させる処理を書きなさい。ただし、同じ数値の順番だけが違うものは一通りとします。
ヒント:Cを斜辺とする三角形A、B、Cは次の条件を満たしています。
Aの2乗+Bの2乗=Cの2乗
(2乗の書き方が分かりませんでした。ごめんなさい)
50以下のすべての3つの正の整数の組み合わせについて、この式が成り立っているかどうかを調べる。同じ数値の順番だけが違うものを除くにはどうすればよいかを考えてください。』
という問題なんですけど、ぜんぜん分からないんです(><)汗汗
いくら考えても、どう考えていいか全然分かりません。。。
プログラミング超初心者なんですけど、誰か教えて下さい!!
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)のループを抜ける等してください。
本当にありがとうございました!!
基礎が出来てないから、じっくり考えてみないと分かりそうもないんですけど、
回答をもとに、じっくり考えてみる事にします!!ありがとうございました!!
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
おお!!なんか、長々と書いて頂いてしまって、申し訳ないです!!(><)っっ本当に有難うございました!!なんか申し訳ないんですけど、初心者なんで、まだ習ってない文字とかがいっぱいで、よく分からなかったです。。。でも、回答をもとに、よく考えてみますね。ありがとうございました!!
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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 数学 問題文 正n角形がある(nは3以上の整数)。この正n角形のn個の頂点のうちの3個を頂点とする三角形に 4 2023/03/22 14:57
- 数学 画像の中学2年生の数学の問題について教えていただきたいです。 三角形ADCが二等辺三角形であることと 2 2023/01/29 16:14
- 数学 高校一年生です。 数学で分からない単元があるので教えて欲しいです。単元は命題の真偽です。 出た課題の 4 2023/08/18 16:30
- 数学 チャート式数学(黄)i.aの問158について 3 2022/10/20 12:10
- 数学 『弧は弦より長し』 8 2022/04/18 10:23
- 数学 球の中心が正三角形の3辺をたどって1周したとき、球が通過してできた立体の体積を求めなさい。 1 2022/06/23 20:35
- 数学 角度当てクイズVol.225の解き方おしえてください 1 2023/06/23 17:45
- 数学 高一数学 場合の数 画像あり 〔 チャート 268ページ 問題エクササイズ1番 〕 (ウ)です。 緑 2 2023/08/21 17:35
- 数学 三角比の相互関係「sinA^2+cosA^2=1」が直角でなくても成り立つ理由について。 これは、三 8 2022/03/31 09:22
- 数学 真偽表(真理値表)について 今日、大学の授業で真偽表(真理値表)について学習しました。(画像)(見づ 5 2022/04/13 01:18
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラミングについて。 1つ...
-
どなたかこのプログラミングを...
-
ネットワークループとルーティ...
-
VBAでの一時停止と再開の方法
-
画面を強制的に再描画させる方法
-
イベントの発生を待つ
-
UWSCの終了の仕方
-
多重ループの抜けだし方
-
【VBA】指定の範囲から特定の文...
-
VBA横データを縦にしたいです
-
DOSコマンドのループ内のTIMEコ...
-
vb.netからエクセル関数書き込み
-
ループフリー
-
これの名称なんて~の?ダッフ...
-
VLC media Playerでのループ再生
-
スレッド起動したフォームを正...
-
CASL2のアセンブリ(?)で質問...
-
テキストボックスの名前に変数...
-
範囲指定したセルを1つずつ飛...
-
VisualStudioにてモザイクの画...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
画面を強制的に再描画させる方法
-
VBAで3秒だけ時間を止めたい
-
VBAでの一時停止と再開の方法
-
どなたかこのプログラミングを...
-
Escキーを押すと、中断する時と...
-
UWSCの終了の仕方
-
エクセルの当番表を作っていま...
-
VBA for i=1 to lastrow
-
「偶数・奇数の和」のフローチ...
-
アクティブセルから、A列最終行...
-
DoEventsが必要な理由について
-
vb.netからエクセル関数書き込み
-
GIFアニメをループさせたくない
-
DOSコマンドのループ内のTIMEコ...
-
範囲指定したセルを1つずつ飛...
-
流れ図(フローチャート)が分か...
-
乱数の桁数指定、または範囲指定。
-
テキストボックスの名前に変数...
-
CSVファイルの特定の行だけを読...
-
vb.netです。2次元配列の要素を...
おすすめ情報