[VBA] 三角数を判定するプログラム

VB-04 三角数を判定するプログラム

 下図のように正三角形の形に点を並べたときに、そこに並ぶ点の総数を 三角数 (triangular number) とよびます。

 Excel VBA 三角数(triangular number)

 $n$ 番目の三角数を $T(n)$ とすると、
 
\[\begin{align*}&T(1) = 1\\[6pt]
&T(2) = 1 + 2 = 3\\[6pt]
&T(3) = 1 + 2 + 3 = 6\\[6pt]
&T(4) = 1 + 2 + 3 + 4 = 10\\[6pt]
&\cdots\cdots\cdots\cdots\cdots\cdots\\[6pt]
&T(n)=\frac{n(n+1)}{2}\end{align*}\]
と表すことができます。

(1) 任意の整数を引数に渡して、それが三角数であれば True、そうでなければ False を返す Functionプロシージャ(ユーザー定義関数)を作ってください。関数の名前は Triangular とします。

(2) Triangular関数を使って、785631 が三角数であるかどうかを判定してください。
 

VB-04 のヒント(判定式を見つけます)

 コードを書く前に 三角数であることを判定する方法 を見つける必要があります(これは純粋に数学の問題です)。
 
 

VB-04 の解答

(1) 与えられた自然数 $x$ が三角数であるとき、
 
\[x=\cfrac{n(n+1)}{2}\]
となります。$n$ について整理すると
 
\[n^2+n-2x=0\]
という $n$ の 2 次方程式が得られます。解の公式を使ってこの方程式を解くと
 
\[n=\frac{-1+\sqrt{1+8x}}{2}\]
となります (2 解のうち正の値をもつ解だけが意味をもちます)。$n$ が自然数ならば $x$ は三角数 $T(n)$ です。$n$ が自然数でなければ $x$ は三角数ではありません。すなわち
 
\[d=\frac{-1+\sqrt{1+8x)}}{2}\]
が $x$ が三角数であるか否かの判定式となります。
 
VB-04 の解答コード

'三角数判定関数

Function Triangular(x As Long) As Boolean

 Dim d As Double

 '三角数の判定式
 d = (-1 + Sqr(1 + 8 * x)) / 2

 'd が整数かつ 0 でない場合
 If d = Int(d) And d <> 0 Then

  Triangular = True

 Else

  Triangular = False

 End If

End Function

 Triangular関数の引数には整数型を渡すようにします。関数の戻り値は何も書かなければ Variant になるので、それでも構いませんが、解答例では真偽値を返す関数であることを明示するために Boolean型にしてあります。判定式 d が整数であることは

d = Int(d)

が成り立つことと同値です (Int()は数値の整数部を取得する関数です)。d が 0 のときも (n = 0 となるので) 条件を満たさないことに注意してください。

(2) ワークシートのセルに

=Triangular(785631)

と入力するか、次のマクロ

Sub TestTriangular()

 Debug.Print Triangular(785631)

End Sub

を実行すると True が返るので、785631 は 三角数 です。

スポンサーリンク
スポンサーリンク
末尾広告
末尾広告

コメントをどうぞ

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください