Excel VBA 数学教室ではアフィリエイトプログラムを利用して商品を紹介しています。

【VBA】ハーシャッド数とズッカーマン数

[VBA-14] ハーシャッド数とズッカーマン数

各桁の数字和がもとの数の約数となる自然数を ハーシャッド数(harshad number) とよびます。たとえば、156 の数字和は 1 + 5 + 6 = 12 であり、これは 156 = 12 × 13 の約数となっているので、156 はハーシャッド数です。

一方、各桁の総乗(すべて掛け合わせた数)がもとの数の約数となる自然数のことを ズッカーマン数 (Zuckerman number) とよびます。たとえば、175 の各桁の総乗は 1 × 7 × 5 = 35 であり、これは 175 = 35 × 5 の約数となっているので、175 はズッカーマン数です。

3 桁の自然数の中で、ハーシャッド数かつズッカーマン数である数字をすべて求めてください。

【ヒント】
・数字和については、VB-09で作成したDigitSum関数を使って求めることができます。

・DigitSum関数のコードを少し変えて、各桁の総乗を求める DigitProduct関数をつくります。

・ある自然数をDigitSum関数とDigitProduct関数に渡して、それぞれの戻り値でもとの数を割り切ることができたなら、その自然数はハーシャッド数かつズッカーマン数です。

【解答】数字和を求める DigitSum関数を再掲しておきます。

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

各桁の総乗を求めるユーザー定義関数も用意しておきます。

'[VBA]各桁の総乗を求める関数
Function DigitProduct(n) As Long
  Dim k As Long, p As Long
  p = 1
  For k = 1 To Len(n)
    p = p * Mid(n, k, 1)
  Next k
  DigitProduct = p
End Function

100 ~ 999 の整数を DigitSum 関数と DigitProduct 関数に渡して、両方の戻り値でもとの数が割り切れたら条件を満たしていることになります。とても簡単なアルゴリズムに思えますが、ズッカーマン数の判定の際には少し注意が必要です。ある数 k を DigitProduct関数に渡したときの戻り値を a とします。

a = DigitProduct(k)

k を a で割った余りが 0 ならば、すなわち

k Mod a = 0

であれば k はズッカーマン数なのですが、a が 0 のときは k Mod a を計算することができずに「ゼロ除算」のエラーが返ってきます。a が 0 になるのは各桁の中にひとつでも 0 があるときです。したがって、a が 0 になる数字に関しては、一番最初の段階で除外して無駄な処理を省くようにします。すなわち、If ステートメントで「 a が 0 でなければ以下の処理をする」というようなコードを記述します。

'[VBA]ハーシャッド数かつズッカーマン数である自然数の探索
Sub HG()
  Dim k As Long
  Dim a As Long, b As Long, c As Long
  For k = 100 To 999
    a = DigitProduct(k)
    If a <> 0 Then
      b = k Mod a
      c = k Mod DigitSum(k)
      If b = 0 And c = 0 Then
        Debug.Print k;
      End If
    End If
  Next k
End Sub

'HGマクロの実行結果:
'111 112 132 135, 144 216 224 312 315 432 612 624 735

➡【VBA】MOD 関数で剰余を計算する

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