[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解説】ハーシャッド数(Harshad number)
[ChatGPT] ハーシャッド数(Harshad number)は、その数字を構成する各桁の数値の和で割り切れる数です。この言葉は、サンスクリット語で「善良な」または「素晴らしい」を意味する「Harsha(ハルシャ)」から派生しています。例を挙げると、42は4と2の和である6で割り切れるので、ハーシャッド数です。同様に、18は1と8の和である9で割り切れるので、ハーシャッド数です。ハーシャッド数の興味深い性質は、その数自体がその各桁の和で割り切れるということです。この性質により、ハーシャッド数は再帰的に定義されます。ハーシャッド数の特性をさらに探求するために、各桁の和で割り切れるような特定の基数に注目することもできます。たとえば、10進数では各桁の和で割り切れる数を考えますが、他の基数(2進数、16進数など)でも同様に各桁の和で割り切れる数を見つけることができます。ハーシャッド数にはさまざまな応用があります。たとえば、整数の桁の和を計算する問題や、デジタルルート(各桁の和を計算し続ける操作)に関連する問題に遭遇した場合、ハーシャッド数の概念が役立つことがあります。