• ベストアンサー

Microsoft Visual Studio 2005のプログラムに

Microsoft Visual Studio 2005のプログラムについてなのですが… 初日は1円の貯金をして、次の日はその倍を貯金する。 前日の倍の預金を続けて10万円をためるためには、何日かかるか。 とゆぅプログラムを作りたいのですが、これはfor文を使いますか? 作り方がよくわからないので、宜しければアドバイスをお願いします

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

  • ベストアンサー
回答No.2

公式 http://www.h3.dion.ne.jp/~y.ich/mathematics/sequence.htm [n * (n+1) * (2*n + 1)] / 6 >= 目標金額 指数計算が絡むので、私の知識では一発での算出方法はわかりませんので、私的な発想でお答えします。 ループさせるにしても、大きな金額である場合、ループが大きくなる恐れがあるので、大まかな日数を算出し、そこからのループを発生させることができると思います。 大まかな日数のは以下のように行います。 (n > 0に限るという条件の下) [n * (n+1) * (2*n + 1)] / 6 = [(2 * n^3) + (3 * n^2) + n)] / 6 なので 【[(2 * n^3) + (3 * n^2) + n)] / 6】 >= 目標金額 >【[(2 * n^3)] / 6】 という事が言えます。 【[(2 * n^3)] / 6】< 目標金額 [(2 * n^3)] < 目標金額 * 6 n^3 < (目標金額 * 6) / 2 n < [(目標金額 * 6) / 2] の立方根 となります。 10万円の場合、nは30万の立方根以下の値となることになります。 これらを元に式を書くと、こんな感じです。 Sub Main()   Dim l_int大阪のおばちゃん曰く As UInteger = 100000 '10万え~ん   Dim l_int日数 As UInteger = 二乗和のよる目標金額達成日数(l_int大阪のおばちゃん曰く)   Call MsgBox(String.Format("{0}日目で達成", l_int日数)) End Sub Function 二乗和のよる目標金額達成日数(ByVal p_int目標金額 As UInteger) As Integer   'n < [(10万 * 6) / 2] の立方根を整数値に切り捨て   Dim l_int大まかな日数計算 As Integer = Math.Floor((p_int目標金額 * 6) / 2) ^ (1 / 3)   Call MsgBox(String.Format("{0}日目以内に達成されるはず", l_int大まかな日数計算))   Dim l_intRet As Integer = l_int大まかな日数計算   Do     '前日の金額を算出     Dim l_int金額 As UInteger = 二乗和(l_intRet - 1)     '前日の金額が目標金額を超えていない場合、現在の日付で初めて超えることになる     If (l_int金額 < p_int目標金額) Then       Exit Do     End If     '日数を引く     l_intRet -= 1   Loop   Return l_intRet End Function Function 二乗和(ByVal p_int引数 As Integer) As UInteger   Return (p_int引数 * (p_int引数 + 1) * (2 * p_int引数 + 1) / 6) End Function

その他の回答 (1)

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

ループ回数が決まっていない(何日で10万円たまるかわからない)から Do~Loop文とかになるのでは? 例えば10日間で貯まる金額ならFor~Nextでいけますけどね。

関連するQ&A