Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonでアームストロング数を判定するプログラムの書き方

この記事では、与えられた整数が「アームストロング数(Armstrong number)」であるかどうかを判定するための考え方と、Pythonによる具体的な実装方法を解説します。

問題の定義

整数 n が与えられたとき、その整数がアームストロング数であるかどうかを判定することを目標とします。

アームストロング数とは?

n 桁の正の整数 abcd… が次の条件を満たすとき、この数は「n 次(オーダー n)のアームストロング数」と呼ばれます。

abcd... = a^n + b^n + c^n + d^n + …

つまり、各桁の数字を「桁数乗」した値の総和が、元の数と一致するかを確認するというものです。

有名な例として、3桁のアームストロング数には 153370371407 などがあります。たとえば 153 は次のように表せます。

153 = 1^3 + 5^3 + 3^3 = 1 + 125 + 27

アルゴリズムの考え方(3桁の場合)

ここでは、最も基本的な「全探索的(ブルートフォース)なアプローチ」として、3桁のアームストロング数=3次の場合の判定方法を説明します。処理の手順は以下の通りです。

  1. 入力された整数を一時変数にコピーします。
  2. 一時変数が 0 より大きい間、次の処理を繰り返します。
    • 「10 で割った余り」で最下位の桁を取り出す
    • その桁の 3 乗を合計値に加算する
    • 一時変数を 10 で整数除算し、処理済みの桁を取り除く
  3. ループ終了後、計算した合計値と元の整数を比較し、一致していればアームストロング数と判定します。

なお、任意の n 次のアームストロング数を判定したい場合は、コード中の「3」を対応する次数の値に置き換えるだけで対応できます(記事末尾の応用編も参照してください)。

Pythonでの実装例

それでは、実際の実装を見てみましょう。

num = 221
sum_ = 0

# 元の値を一時変数に退避
temp = num
while temp > 0:
    digit = temp % 10   # 最下位の桁を取り出す
    sum_ += digit ** 3  # 各桁の3乗を加算
    temp //= 10         # 処理済みの桁を削除

# 合計値と元の値を比較して判定
if num == sum_:
    print(num, "is an Armstrong number")
else:
    print(num, "is not an Armstrong number")

実行結果

221 is not an Armstrong number

221 の場合、各桁の 3 乗の和は 2³ + 2³ + 1³ = 8 + 8 + 1 = 17 となり、元の値と一致しないため「アームストロング数ではない」と判定されます。

コードの解説

すべての変数と関数は、下図に示すようにグローバルスコープで宣言されています。

Pythonでアームストロング数を判定するプログラムの書き方

  • digit = temp % 10:10 で割った余りを求めることで、現在の最下位の桁を取得します。
  • sum_ += digit ** 3:取り出した桁を 3 乗して累積加算します。
  • temp //= 10:整数除算によって最下位の桁を切り捨て、次の桁の処理へ移ります。

応用:任意の桁数に対応させるには

3 で固定せず、桁数を動的に求めるようにすれば、どんな桁数のアームストロング数にも対応できます。

num = 1634
order = len(str(num))  # 桁数(次数)を自動取得
sum_ = 0

temp = num
while temp > 0:
    digit = temp % 10
    sum_ += digit ** order
    temp //= 10

if num == sum_:
    print(num, "is an Armstrong number")
else:
    print(num, "is not an Armstrong number")
1634 is an Armstrong number

1634 は 1⁴ + 6⁴ + 3⁴ + 4⁴ = 1 + 1296 + 81 + 256 = 1634 となるため、4次のアームストロング数です。

まとめ

この記事では、与えられた整数がアームストロング数かどうかを判定するアプローチとして、「各桁を取り出してべき乗の和と比較する」という基本手法を学びました。剰余演算(%)と整数除算(//)を組み合わせることで、シンプルに桁ごとの処理が実現できる点がポイントです。また、次数を動的に変更すれば、任意の桁数にも容易に拡張できます。

  1. Pythonで素数を判定するプログラムの書き方を徹底解説

    はじめに この記事では、「与えられた数値が素数かどうかを判定する」という問題に対する解決策を、Pythonのコード例とともにわかりやすく解説します。 問題の概要 問題設定:ある数値が与えられたとき、その数が素数であるかどうかを判定するプログラムを作成します。 まず「素数」の定義をおさらいしましょう。1より大きい正の整数のうち、1とその数自身以外に約数を持たない数を素数(そすう)と呼びます。たとえば、2、3、5、7などはそれ以外の約数を持たないため、素数です。 プログラムの考え方 今回作成するプログラムでは、入力された数値が素数かどうかを以下の手順で判定します。 1以下の数値は素数ではない

  2. Pythonで与えられた数値がフィボナッチ数かどうかを判定する方法

    本記事では、与えられた数値がフィボナッチ数であるかどうかを判定する問題の解決策について解説します。 問題の定義 ある数値 n が与えられたとき、その数値がフィボナッチ数であるかどうかを判定します。 第 n 項のフィボナッチ数は、直前の2つのフィボナッチ数の和として定義されることは広く知られています。しかし、フィボナッチ数列には漸化式以外にも興味深い数学的性質があります。 フィボナッチ数の判定条件 ある数値 n がフィボナッチ数であるのは、「5×n² + 4」または「5×n² − 4」のいずれかが完全平方数であるとき、かつそのときに限る この性質を利用すれば、フィボナッチ数列を実際に生成しなくて