|
分類:[VB.NET/VB2005 以降]
http://cgi.2chan.net/m/res/34414.htm
4/5=1/a+1/b+1/c
a,b,cは整数
という問題を練習としてVB2005でやってみました。(初心者です)
解としては、順列ではなく組み合わせでOK、ということにします。
09/05/17(日)08:48:59 No.34422 において
-30 -6 1
-30 2 3
-10 -10 1
-5 2 2
-4 1 20
2 4 20
2 5 10
という書き込みがありますのでとりあえずこれを正解とします。
出力ウィンドウへの出力結果です*******************
Atype -030 -006 001 0
Btype -030 -006 001 0.8 0
Atype -030 002 003 0
Btype -030 002 003 0.8 0
Atype -010 -010 001 0
Btype -010 -010 001 0.8 0
Atype -005 002 002 0
Btype -005 002 002 0.8 0
Atype -004 001 020 0
Btype -004 001 020 0.8 0
Atype 002 004 020 0
Btype 002 004 020 0.8 0
Atype 002 005 010 0
Btype 002 005 010 0.8 -1.11022302462516E-16
*****************ここまで出力結果
問題は最後に判定OKとなる計算のときの誤差です。
正解にあわせるために
f T < 0.800001 And T >= 0.799999 Then
という誤差範囲を設定することにしました。(数値はヤマカン)
質問としては、
1.上記判定文の「許容誤差」の適正値を決定する論理はありますか?
#-1E-16という誤差を予想できるか?ということになると思いますが。
2.最後の解以外で誤差が発生しない理由は?
2進数なら1/10でも循環小数になりそうな気がしますが・・・
3.今回の問題についてのプログラム(下記)の改善すべき点はどこでしょうか?
#計算範囲を-1000から+1000にした時の処理時間の短縮に
#ついても考えたいです。現在2-3秒かかっています。
Dim A As Integer
Dim B As Integer
Dim C As Integer
Dim T As Double
Dim R As Integer = 100
Me.Cursor = Cursors.WaitCursor
For A = -R To R
If A <> 0 Then
For B = -R To R
If B <> 0 And A <= B Then
For C = -R To R
If C <> 0 And A <= C And B <= C Then
T = 4 * A * B * C - 5 * A * B - 5 * B * C - 5 * A * C
If T = 0 Then
Debug.Write("Atype ")
Debug.WriteLine(Format(A, " 000 ;-000 ") _
& Format(B, " 000 ;-000 ") _
& Format(C, " 000 ;-000 ") _
& T & " " _
)
End If
T = 1 / A + 1 / B + 1 / C '実数計算の判定式
If T < 0.800001 And T >= 0.799999 Then
Debug.Write("Btype ")
Debug.WriteLine(Format(A, " 000 ;-000 ") _
& Format(B, " 000 ;-000 ") _
& Format(C, " 000 ;-000 ") _
& T & " " _
& (T - CDbl(0.8)))
End If
My.Application.DoEvents()
End If
Next C
End If
Next B
End If
Next A
Me.Cursor = Cursors.Default
|