Pythonで奇数桁と偶数桁の合計の差を判定するプログラム
この記事では、与えられた問題を解決するための解法とアプローチについて詳しく解説します。
問題文
整数が1つ与えられたとき、奇数桁の合計と偶数桁の合計の差が0であるかどうかを判定する必要があります。
素朴なアプローチ(ブルートフォース)
最も単純な方法は、数値を構成するすべての偶数桁と奇数桁の合計をそれぞれ計算し、その差を求めることです。しかし、この方法では各桁を順番に処理するため、桁数に比例した計算時間が必要になります。
効率的なアプローチ:11の倍数判定を活用
計算時間を削減するために、「暗算の数学」でよく知られている性質を利用します。それは「ある整数の奇数桁の合計と偶数桁の合計の差が0になるのは、その数が11で割り切れる場合に限る」というものです。
したがって、以下の実装では、数値が11で割り切れるかどうかを確認するだけで判定を行います。
これにより、計算量は O(n) から、剰余演算と比較に必要な定数時間 O(1) へと大幅に削減されます。
実装例
def isDiff(n):
return (n % 11 == 0)
# main
n = 785643
if (isDiff(n)):
print("Yes")
else:
print("No")
出力結果
No
この例では、785643は11で割り切れないため「No」が出力されます。すべての変数と関数は、下図のようにグローバルスコープで宣言されています。

まとめ
この記事では、整数の奇数桁と偶数桁の合計の差を計算・判定するアプローチについて学びました。各桁を実際に足し合わせる代わりに、11の倍数判定という数学的な性質を利用することで、非常に効率的に問題を解けることを確認しました。同様の性質は、競技プログラミングやアルゴリズムの最適化の場面でも応用できる有用なテクニックです。
-
Pythonで二分木のノードとその子孫の最大絶対差を求めるプログラム
問題概要 二分木が与えられたとき、任意のノードとその子孫との間の絶対差の最大値を求めることを考えます。 例えば、次のような二分木が入力として与えられた場合を考えてみましょう。 この場合、ノード8とノード1の間の差が最も大きくなるため、出力は 7 となります。 解法のアプローチ:DFSを使った追跡 この問題は、DFS(深さ優先探索)を用いることで効率的に解けます。各ノードについて「その部分木内の最小値」と「最大値」を追跡しながら、現在のノードの値との差を順次更新していくのがポイントです。 具体的な手順は以下の通りです。 dfs() 関数を定義します。引数としてノードを受け取ります。 ノード
-
【Python】約数の個数が偶数か奇数かを判定するプログラムの書き方
この記事では、ある整数の約数の個数が偶数か奇数かを判定するPythonプログラムについて、その考え方と実装方法をわかりやすく解説します。 問題文 ある数「n」が与えられたとき、その約数の総数が偶数であるか奇数であるかを判定してください。 例えば、n = 10 の場合、約数は 1, 2, 5, 10 の4つなので「偶数」。一方、n = 100 の場合は 1, 2, 4, 5, 10, 20, 25, 50, 100 の9つとなり「奇数」となります。 アプローチ:約数を実際に数える 最も基本的な方法は、すべての約数を見つけ、その個数が偶数か奇数かをチェックすることです。 ここで重要なのは、約数