• ベストアンサー

Do...Loopにつてご教授ください

Visual Basicの課題で、 3+3²+3³+・・・3n乗で、500から50000の間に入る数字は 何個あるか?を求めるアプリを作らなければいけないのですが、 Do...Loop構造の繰り返し処理が理解できていないために解答 することができません。 解答と考え方をご教授いただけば大変助かります。 どうぞよろしくお願いいたします。

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

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

背景には等比級数の和の式がある。公式もあるが、あえて先生はLOOP(繰り返し処理)の問題に持って行ったものだろう。 そして単純に3^nまでの和でなくて、少しひねって>500から50000の間に入る数字は、としたものと見える。 ここで500を超えた時のnを最終段階まで覚えておかないといけないが、それを仕組むためには、その超えて次の次の段階ではnを覚えておく変数に代入し(値を崩してしまわ)ないようにしないといけない。この技法の方が、プログラマ的には重要(よく出くわす)のを先生は知っているのかな。 これをスイッチ、(とかサイン、フラグ(3つとも通称))という技法でやってみた。使わない方法はあるのかな。 500を超えるまでと、50000を超える(この段階でプログラムを終了してよい)の2段階(2区分)に分ける方法もあると思う(Loopが2回出てくる)が、今回は前者でやってみた。 Sub test02() s = 0 '各項までの部分和 初期値として0 n = 1 '累乗の最初1 ovr500 = "N" '部分和が500超えず '--繰り返し部分 Do While s <= 50000 s = s + 3 ^ n MsgBox s If s > 500 Then If ovr500 = "N" Then from = n MsgBox "500超えのn " & n ovr500 = "Y" '超えたというフラグを立てる End If End If ’Range("F" & n) = s n = n + 1 '累乗値を1増やす,その後、繰り返し Loop '-- MsgBox "50000超えのn " & (n - 1) 'sが50000を超えるとここへ来るが、終了 '課題の数を計算 MsgBox (n - 1) - from '(10-1)-6 End Sub ーーー 確認のためやエクセルでやるなら エクセルでは A,B、C列 1 3 3 2 9 12 3 27 39 4 81 120 5 243 363 6 729 1092 7 2187 3279 8 6561 9840 9 19683 29523 10 59049 88572 A列は連番数字 B列の式 B1セルに =3^A1 と入れて下方向に式を複写 C列の式 C1セルに =SUM($B$1:B1) と入れて下方向に式を複写 結果は上記の通り。  視察で 9-6+1の4数(個)が該当。

twin-dragon
質問者

お礼

大変詳しく説明頂ありがとうございます。 助かりました。 少しは自分でも解けるようにがんばってみます。 ありがとうございました。

その他の回答 (2)

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.2

 これで如何でしょうか? Sub QNo8976833_Do―Loopについてご教授ください() Dim n As Long Dim minN As Long Dim Sigma As Long Dim minSigma As Long Dim Answer As Long n = 0 Do n = n + 1 Sigma = Sigma + 3 ^ n If Sigma < 500 Then minN = n minSigma = Sigma End If Loop Until Sigma > 50000 Sigma = Sigma - 3 ^ n n = n - 1 Answer = n - minN minN = minN + 1 minSigma = minSigma + 3 ^ minN MsgBox "Σ=3+3^2+3^3+・・・3^n乗で、" & vbCrLf & "Σの値が500から50000の間に入る数字の個数は" & vbCrLf & _ " n=" & minN & " Σ=" & minSigma & vbCrLf & "   から" & vbCrLf & _ " n=" & n & " Σ=" & Sigma & vbCrLf & "   までの" & vbCrLf & Answer & "個です。" End Sub

twin-dragon
質問者

お礼

丁寧にご教示頂ありがとうございます。 類似する問題にもチャレンジしてみます。 ありがとうございました。

  • mshr1962
  • ベストアンサー率39% (7417/18945)
回答No.1

y = 0 x = 0 z = 3 n = 0 LLimit = 500 HLimit = 50000 Do Until y > HLimit n = n + 1 '乗数n If y >= LLimit Then x = x + 1 '解 y = y + z ^ n Loop

twin-dragon
質問者

お礼

早速の解答をありがとうございました。 毎回参考になります。 ありがとうございます。

関連するQ&A