[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
エクセルや数学に関するコメントをお寄せください
【AI連載小説】数学のリズム、エクセルの旋律(20)
「VBAでハーシャッド数を探そう!」
「みんな、今日はハーシャッド数を探してみようぜ!」真琴が熱い眼差しでメンバーたちに呼びかけた。
村雨研伸が疑問そうな顔をして尋ねる。「ハーシャッド数って何だい?」
真琴は笑顔で説明する。「ハーシャッド数は、その数自体の各桁の数字の和で割り切れる数のことさ。例えば、18はハーシャッド数だよ。なぜなら、1+8=9で、18は9で割り切れるからさ。」
雨宮隆治が興味津々に言った。「なるほど、それをExcel VBAで探してみるわけだね。どうやってやるのか教えてくれ。」
真琴がエクセルを開きながら続ける。「まず、1から順番に数を調べていく。各桁の数字の和を求めて、元の数で割り切れるかどうか判定すればいい。」
二階堂月子が手元のノートにメモをとりながら言った。「それなら、VBAのForループを使って簡単に実装できそうだね。」
真琴がVBAコードを打ち込みながら示す。「確かに、こんな感じでできるよ。」
真琴が実行すると、ハーシャッド数が見つかるたびにメッセージボックスが表示され、メンバーたちはその瞬間に興奮を覚えていた。