【VBA】数字和 (digit sum) を返す関数

【VBA09】数字和を返す関数

 自然数の各桁の数字を足し合わせた数を 数字和 (digit sum) とよびます。たとえば 3159 の数字和は 3 + 1 + 5 + 9 = 18 となります。任意の自然数を引数に渡すと数字和を返す Function プロシージャ(ユーザー定義関数)をつくってください。関数の名前は DigitSum とします。
 
【ヒント】数字和を求めるには、渡された数字の桁数を取得して、さらに各桁の数字を取り出すという処理が必要です。VBA で「取り出す」といえば、あの関数です。

宇宙と宇宙をつなぐ数学 IUT理論の衝撃

中古価格
¥1,275から
(2019/8/6 22:02時点)


【解答】文字数を取得する Len 関数を使って、引数に受け取った数字 n の桁数を調べることができます。Len 関数の引数には文字列を指定することなっていますが、数値を入力しても自動的に文字列型に変換されるので問題ありません。ただし引数の型は宣言しないように(つまり Variant型に)しておく必要があります。

 ある文字列から特定の文字を取り出すときは Mid 関数を使います。

Mid(文字列, 開始位置, [取り出す文字の長さ])

 たとえば、n の k 番目から 1 文字を取り出すには

Mid(n, k, 1)

と記述します。k をループ変数として 1 から Len(n) まで取り出して足し合わせれば数字和を得ることができます。

'VBA-09 解答コード

'桁を加算する関数
Function DigitSum(n) As Long

  Dim k As Long, s As Long

  For k = 1 To Len(n)
   s = s + Mid(n, k, 1)
  Next k

  DigitSum = s

End Function

 ワークシートのセルに

=DigitSum(1234)

と入力すると 10 が返ってきます。VBE のイミディエイトウィンドウで確認する場合は次のコードを入力してください。

Sub DisigSumTest()
  Debug.Print DigitSum(1234)
End Sub

 

【VBA10】各桁を 3 乗した数の和がもとの数と等しくなる数

(1) 1000 以下の自然数で、各桁を n 乗した数の和がもとの数と等しくなる数を出力する Functionプロシージャ(ユーザー定義関数)をつくってください。関数名は DigitPowerSum とします。

(2) 各桁を 3 乗した数の和がもとの数と等しくなるような 1000 以下の自然数をすべて求めてください。
 
【ヒント】VBA-09 の類題です。(1) は VBA09 のコードに少し手を加えるだけです。(2) では (1) で作った DigitPowerSum関数を使います。

現代整数論の風景

新品価格
¥2,700から
(2019/8/8 06:50時点)


【解答】(1) 引数 x, n を受け取って、x の各桁を取り出して n 乗した数を足し合わせていきます。

'VBA-10 (1) 解答コード

'各桁の n 乗を加算する関数
Function DigitPowerSum(x, n As Long) As Long

  Dim k As Long, s As Long

  For k = 1 To Len(x)
    s = s + Mid(x, k, 1) ^ n
  Next k

  DigitPowerSum = s

End Function

 
(2) 1 から 1000 までの数 k を DigitPowerSum(k, 3) と比較して、一致していれば表示するようなプログラムを書きます。

'VBA-10 (2) 解答コード

'各桁を3乗した数の和がもとの数と等しくなる数の探索
Sub EqDPS()

  Dim k As Long

  For k = 1 To 1000
    If k = DigitPowerSum(k, 3) Then
      Debug.Print k;
    End If
  Next k

End Sub

 実行すると条件を満たしている数が並びます。

 1 153 370 371 407

 念のために確認しておくと、

  13 = 1
  13 + 53 + 33 = 1 + 125 + 27 = 153
  33 + 73 + 03 = 27 + 343 + 0 = 370
  33 + 73 + 13 = 27 + 343 + 1 = 371
  43 + 03 + 73 = 64 + 0 + 343 = 407

となって、確かに条件を満たしていることがわかります。

【VBA11】互いに素である組を表示するマクロ

 自然数 a, b の最大公約数が 1 であるとき、「 a, b は互いに素である」といいます。たとえば、(a, b) = (5, 9) の最大公約数は 1 なので、5 と 9 は互いに素です。1 はすべての自然数と互いに素です。そこでいま、2 < a < 9, 2 < b < 9 として、互いに素である (a, b) をすべて表示するマクロをつくってください。ただし、(5, 9) と (9, 5) のような組合せは同じ組を表すので、片方だけを表示させるものとします。
 
【ヒント】
・ワークシート関数 (Excel関数) のなかに、最大公約数を求める GCD という関数があります。ワークシート関数を VBA で呼び出すときは

WorksheetFunction.関数名(引数1 [, 引数2, ...)

と記述します。

・For … Next を入れ子にすれば、自然数の組 (x, y) を列挙することは簡単ですが、この問題では重複なしで表示することが求められています。変数の使い方に工夫が必要です。

新 Excelコンピュータシミュレーション -数学モデルを作って楽しく学ぼう-

中古価格
¥2,354から
(2017/8/15 01:52時点)


【解答】調べる組を (x, y) とおきます。

 x = 2 のとき、(2, y) において y を x + 1 から 9 まで動かすと、

(2, 3), (2, 4), (2, 5), (2, 6), (2, 7), (2, 8), (2, 9)

という組合せが得られます。最大公約数が 1 となる組合せを選び出して並べると

(2, 3), (2, 5), (2, 7), (2, 9)

となります。

 x = 3 のとき、(3, y) において y を x + 1 から 9 まで動かすと、

(3, 4), (3, 5), (3, 6), (3, 7), (3, 8), (3, 9)

という組合せが得られます。最大公約数が 1 となる組合せを選び出して並べると

(3, 4), (3, 5), (3, 7), (3, 8)

となります。以下同様にして、x = 9 まで調べれば、互いに素となる組をすべて見つけることができます。

'VBA-11 解答コード

'互いに素である組の探索
Sub CoPrime()

  Dim x As Long, y As Long, g As Long

  For x = 2 To 9

    For y = x + 1 To 9

      'x と y の最大公約数
      g = WorksheetFunction.Gcd(x, y)

      If g = 1 Then
        Debug.Print "(" & x & ", " & y & "), ";
      End If

    Next y

  Next x

End Sub

 CoPrimeマクロを実行すると互いに素である組が並びます。

(2, 3), (2, 5), (2, 7), (2, 9), (3, 4), (3, 5), (3, 7), (3, 8), (4, 5),
(4, 7), (4, 9), (5, 6), (5, 7), (5, 8), (5, 9), (6, 7), (7, 8), (7, 9), (8, 9)

エクセルや数学に関するコメントをお寄せください