« HTMLファイルの目次を作る2 | トップページ | イミディエイトウィンドウ内をクリアする »

2011年5月 1日 (日)

ピタゴラス数

ピタゴラス数とは
2乗するとひとつが他の2つの2乗の和になるような
3つの自然数の組のことです。

式で表すと

a^2 + b^2 = c^2

です。

このピタゴラス数をVBAで求めたいと思います。

プログラム的に求めようと思います。

プログラム的とはどういうことかというと
For文で手当たり次第に条件に合うかどうか
確かめていくということです。

さきほどの式のように変数a、bを作ります。
この2つの変数a、bを使ってFor文を1つ入れ子にします。

入れ子にしたほうのFor文の中で
ピタゴラス数であるかの条件判定(If文)をします。
条件は次のようにしました。

Int(Sqr(a^2 + b^2)) = Sqr(a^2 + b^2)

Sqr関数は引数の平方根を返します。
上の条件は、
(a^2 + b^2)の平方根が整数であるときTrueとなり
ピタゴラス数と判断します。

結果はイミディエイトウィンドウに出力します。

コードはこちら

ピタゴラス数を求めるコード:

Sub macro110501a()
'ピタゴラス数

    Dim a As Integer, b As Integer, c As Integer
    Dim Var1 As Double, Var2 As Double
    Dim MaxValue As Integer
    MaxValue = 100
   
    For a = 1 To MaxValue
        For b = a To MaxValue
            Var1 = a * a + b * b
            If Int(Sqr(Var1)) = Sqr(Var1) Then
                Var2 = Sqr(Var1)
                If Var1 = Var2 * Var2 Then
                    Debug.Print a & ", " & b & ", " & Var2
                End If
            End If
        Next b
    Next a
   
End Sub

実行後のイミディエイトウィンドウの一部:
Vba20110501a

ピタゴラス数を求めるとか言う程のプログラムではないですね。
Sqr関数に頼りきっています。

ということで、
このままでもつまらないので
Sqr関数を使わないで平方根を求めてみます。

数学の問題を解くときに
手で計算して無理数の大体の値を求めるときに使う手法で
平方根を近似してみます。

ルート2とかルート3は暗記しているけれど
ルート7までは覚えていないことが多いのではないでしょうか。
そういうときに
手で計算して平方根の大体の値を求めたいことがあります。
ルート7の場合の手順は次のようです。

4 < 7 < 9
2^2 < 7 < 3^2
2 < ルート7 < 3

ですのでルート7は2より大きく3より小さい値です。
次に小数点第一位を求めます。
小さいほうからルート7に近づいていくようにします。

2.1^2
2.2^2
2.3^2

2.9^2

のように順番に7(ルート7の2乗)と比較します。
比較して7よりも大きくなったら
1つ前の値を小数点第一位にします。
このようにして求めると、ルート7の小数点第一位は6です。

小数点第二位も同様にして求めます。

2.61^2
2.62^2
2.63^2

2.69^2

のように順番に7と比較します。同じように任意の小数点の位まで求めます。

変数pが小数点が第何位かをあらわします。
下のコードの

If p <= -5 Then

の箇所で小数第何位まで求めるかを決めます。
いまは小数第五位までになっています。

結果はイミディエイトウィンドウに出力します。

コードはこちら

平方根を求めるコード:

Sub macro110501b()
'平方根

    Dim x As Integer
    Dim a As Integer, a2 As Double
    Dim i As Double
    Dim p As Double
    x = 7 '求めるルートの値
    p = -1
   
    '整数部分を求める
    For i = 1 To 1000
        If i * i > x Then
            a = i - 1
            a2 = a
            Exit For
        End If
    Next i
   
    '小数点以下を求める
Step1:
    For i = 10 ^ p To (10 ^ p) * 9 Step 10 ^ p
        If (a2 + i) ^ 2 > x Then
            a2 = a2 + i - (10 ^ p)
            If p <= -5 Then
                '小数第五位までで終了

                GoTo Step2:
            End If
            p = p - 1
            GoTo Step1
        End If
    Next i
   
Step2:
    '結果をイミディエイトに表示
    Debug.Print a2
    Debug.Print Sqr(x)
   
End Sub

実行後のイミディエイトウィンドウ:
Vba20110501b

上の値が上のコードで求めたルート7、
下がSqr関数で求めたルート7です。

|

« HTMLファイルの目次を作る2 | トップページ | イミディエイトウィンドウ内をクリアする »

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: ピタゴラス数:

« HTMLファイルの目次を作る2 | トップページ | イミディエイトウィンドウ内をクリアする »