Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


2497 / 13645 ツリー ←次へ | 前へ→

【67635】分数計算、if文。 cosuke 10/12/20(月) 16:50 質問[未読]
【67636】Re:分数計算、if文。 momo 10/12/20(月) 17:36 発言[未読]
【67642】Re:分数計算、if文。 cosuke 10/12/20(月) 22:06 発言[未読]
【67650】Re:分数計算、if文。 momo 10/12/21(火) 8:45 発言[未読]
【67673】Re:分数計算、if文。 山猿 10/12/22(水) 22:08 発言[未読]
【67675】Re:分数計算、if文。 SS 10/12/24(金) 11:23 発言[未読]
【67679】Re:分数計算、if文。 SS 10/12/24(金) 16:31 発言[未読]
【67669】Re:分数計算、if文。 metabeaux 10/12/22(水) 17:21 回答[未読]
【67677】Re:分数計算、if文。 metabeaux 10/12/24(金) 16:13 回答[未読]

【67635】分数計算、if文。
質問  cosuke  - 10/12/20(月) 16:50 -

引用なし
パスワード
   初めまして、cosukeと申します。
この度、VBAで高校時代解けなかった過去問をVBAで答を導き出そうと頑張ってみたのですが、どうも反応しません^^;問題は以下のとおりです。

P氏はN頭のラクダを3人の息子で分けるように遺言して亡くなりました。
その遺言によればNのa分の1、b分の1、c分の1(a,b,cは自然数でa>b>cとする)が息子達の相続するラクダの数である。ただし、Nはa,b,cのいずれの倍数でもない。1/a+1/b+1/c=1でないので3人が悩んでいると、通りがかりの旅人がよい工夫を思いついた。旅人のラクダを1頭加え、N+1を遺言の率に従って分割すれば、うまく分割でき、1頭余る。例えば、N=11(a,b,c)=(6,4,2)がその例である。

とりあえず、条件を満たす(a>b>c除く)N,a,b,cの値の組み合わせを1<a,b,c<10の範囲でとりあえず全て出してから題意にそうように少しずつ変更していこうかと思い、下記のプログラムを作ってみたのですが、どうも反応しません(汗

自分では何がおかしいのかわからず困っています。
アドバイス宜しくお願いします。


Sub abc()
'宣言
Dim a, b, c, N, i As Integer

'式
Cells(1, 1) = "N/ (1 + N)"
Cells(2, 1) = "1 / a + 1 / b + 1 / c"

'値
Cells(5, 1) = "a"
Cells(6, 1) = "b"
Cells(7, 1) = "c"
Cells(8, 1) = "N"

'総当り
For a = 1 To 10
  For b = 1 To 10
    For c = 1 To 10
      x = 1 / a: y = 1 / b: z = 1 / c: N = a + b + c
      i = i + 1
      If x + y + z = N / (1 + N) Then
        Cells(5, 2 + i) = a
        Cells(6, 2 + i) = b
        Cells(7, 2 + i) = c
        Cells(8, 2 + i) = a + b + c
        Cells(4, 2 + i) = i & "組目"
      End If
    Next c
  Next b
Next a

End Sub

【67636】Re:分数計算、if文。
発言  momo  - 10/12/20(月) 17:36 -

引用なし
パスワード
   ▼cosuke さん:

とりあえずi=i+1の位置がおかしいので→の方にこたえがあるだけだと思いますが

>      i = i + 1
>      If x + y + z = N / (1 + N) Then

を下のように位置を変えてみるのと
x+y+zは1じゃないんですか?

      If x + y + Z = 1 Then
        i = i + 1

【67642】Re:分数計算、if文。
発言  cosuke  - 10/12/20(月) 22:06 -

引用なし
パスワード
   返答ありがとうございます。
x+y+zは1ではないですね。

例えば(a,b,c,N)=(6,4,2)のとき、x+y+z=11/12です。

【67650】Re:分数計算、if文。
発言  momo  - 10/12/21(火) 8:45 -

引用なし
パスワード
   ▼cosuke さん:
>返答ありがとうございます。
>x+y+zは1ではないですね。

そうですか。
問題の意味と結果との関係が良く分からない
(1余る?)ので・・・

とりあえずVBAで計算させるのでしたら
少数演算誤差を考慮してなるべく整数で計算させてみましょう。

【67669】Re:分数計算、if文。
回答  metabeaux  - 10/12/22(水) 17:21 -

引用なし
パスワード
   a,b,cの最小公倍数が、N+1になります。
その方向でやってみてはいかがでしょうか。

【67673】Re:分数計算、if文。
発言  山猿  - 10/12/22(水) 22:08 -

引用なし
パスワード
   >例えば(a,b,c,N)=(6,4,2)のとき、x+y+z=11/12です。
そうなら
If x + y + z = (N-1) / N Then
じゃないんですか?

計算誤差もあるでしょうから
If Round(x + y + z,5) = raound((N-1) / N,5) Then
などとしてみるとか。

あと N/a, N/b, N/cなどが整数になるという条件もいるのでは?

【67675】Re:分数計算、if文。
発言  SS  - 10/12/24(金) 11:23 -

引用なし
パスワード
   ▼cosuke さん:
作ってみました。
初めにa,b,cの大小関係を逆に考えていたので出力の並びが良くないですが
一応リストアップできていると思います。
変数lastで検討数を調整できるようにしましたがn+1の場合必要なさそうです。

Sub test()
  Dim a As Long, b As Long, c As Long, d As Long, n As Long
  Dim a1 As Long, b1 As Long, c1 As Long
  Dim last As Long
  Dim i As Long
  
  last = 100
  i = 1
  Cells.ClearContents
  Cells(1, 1).Value = "a"
  Cells(1, 2).Value = "b"
  Cells(1, 3).Value = "c"
  Cells(1, 4).Value = "n"
  Cells(1, 5).Value = "n+1"
  Cells(1, 6).Value = "(n+1)/a"
  Cells(1, 7).Value = "(n+1)/b"
  Cells(1, 8).Value = "(n+1)/c"
  Cells(1, 9).Value = "和"
  
  For c = 1 To last - 3
    For b = c + 1 To last - 2
      For a = b + 1 To last - 1
        d = (a * b + b * c + c * a)
        If (a * b * c - d) = 0 Then
          
        ElseIf d Mod (a * b * c - d) = 0 Then
          n = d / (a * b * c - d)
          If n > a And (n + 1) Mod a = 0 And (n + 1) Mod b = 0 _
                  And (n + 1) Mod c = 0 Then
            i = i + 1
            a1 = (n + 1) / a
            b1 = (n + 1) / b
            c1 = (n + 1) / c
          'If n > a Then
            Cells(i, 1).Value = a
            Cells(i, 2).Value = b
            Cells(i, 3).Value = c
            Cells(i, 4).Value = n
            Cells(i, 5).Value = n + 1
            Cells(i, 6).Value = a1
            Cells(i, 7).Value = b1
            Cells(i, 8).Value = c1
            Cells(i, 9).Value = a1 + b1 + c1
          End If
        End If
      Next a
    Next b
  Next c
End Sub

>返答ありがとうございます。
>x+y+zは1ではないですね。
>
>例えば(a,b,c,N)=(6,4,2)のとき、x+y+z=11/12です。

【67677】Re:分数計算、if文。
回答  metabeaux  - 10/12/24(金) 16:13 -

引用なし
パスワード
   最小公倍数を利用する方向でマクロを組んでみました。

a>b>cではなく、a<b<cになっちゃってますが。

Sub abc()
  '宣言
  Dim a, b, c, N1, N2, N, i As Long
  
  '値
  Cells(5, 1) = "a"
  Cells(6, 1) = "b"
  Cells(7, 1) = "c"
  Cells(8, 1) = "N"
  
  '総当り
  For a = 2 To 10
    For b = a + 1 To 10
      For c = b + 1 To 10
        N1 = LCM(a, b)
        N2 = LCM(b, c)
        N = LCM(N1, N2)
        If N / a + N / b + N / c = N - 1 Then
          Cells(5, 2 + i) = a
          Cells(6, 2 + i) = b
          Cells(7, 2 + i) = c
          Cells(8, 2 + i) = N - 1
          Cells(4, 2 + i) = i + 1 & "組目"
          i = i + 1
        End If
      Next c
    Next b
  Next a
End Sub

Function GCD(ByVal a As Long, ByVal b As Long) As Long
  If a * b = 0 Then GCD = 0: Exit Function
  Dim x As Long
  Do
    x = a Mod b
    a = b
    b = x
  Loop Until b = 0
  GCD = a
End Function

Function LCM(ByVal a As Long, ByVal b As Long) As Long
  If a * b = 0 Then LCM = 0: Exit Function
  Dim x As Long
  x = GCD(a, b)
  LCM = a * b / x
End Function

【67679】Re:分数計算、if文。
発言  SS  - 10/12/24(金) 16:31 -

引用なし
パスワード
   ▼cosuke さん:
metabeauxさんの回答を確認してみたら、私の場合条件が不足していましたので
修正しました。

>作ってみました。
>初めにa,b,cの大小関係を逆に考えていたので出力の並びが良くないですが
>一応リストアップできていると思います。
>変数lastで検討数を調整できるようにしましたがn+1の場合必要なさそうです。
>
>Sub test()
>  Dim a As Long, b As Long, c As Long, d As Long, n As Long
>  Dim a1 As Long, b1 As Long, c1 As Long
>  Dim last As Long
>  Dim i As Long
>  
>  last = 100
>  i = 1
>  Cells.ClearContents
>  Cells(1, 1).Value = "a"
>  Cells(1, 2).Value = "b"
>  Cells(1, 3).Value = "c"
>  Cells(1, 4).Value = "n"
>  Cells(1, 5).Value = "n+1"
>  Cells(1, 6).Value = "(n+1)/a"
>  Cells(1, 7).Value = "(n+1)/b"
>  Cells(1, 8).Value = "(n+1)/c"
>  Cells(1, 9).Value = "和"
>  
>  For c = 1 To last - 3
>    For b = c + 1 To last - 2
>      For a = b + 1 To last - 1
>        d = (a * b + b * c + c * a)
>        If (a * b * c - d) = 0 Then
>          
>        ElseIf d Mod (a * b * c - d) = 0 Then
>          n = d / (a * b * c - d)
          If n+1 >= a And (n + 1) Mod a=0 And (n + 1) Mod b=0 _
                  And (n + 1) Mod c = 0 Then
>            i = i + 1
>            a1 = (n + 1) / a
>            b1 = (n + 1) / b
>            c1 = (n + 1) / c
>            Cells(i, 1).Value = a
>            Cells(i, 2).Value = b
>            Cells(i, 3).Value = c
>            Cells(i, 4).Value = n
>            Cells(i, 5).Value = n + 1
>            Cells(i, 6).Value = a1
>            Cells(i, 7).Value = b1
>            Cells(i, 8).Value = c1
>            Cells(i, 9).Value = a1 + b1 + c1
>          End If
>        End If
>      Next a
>    Next b
>  Next c
>End Sub
>
>>返答ありがとうございます。
>>x+y+zは1ではないですね。
>>
>>例えば(a,b,c,N)=(6,4,2)のとき、x+y+z=11/12です。

2497 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free