Xで割り切れる最小のK桁の数を求めるPythonプログラム
この記事では、「指定した整数Xで割り切れる最小のK桁の数」を求める問題の解き方とアプローチについて詳しく解説します。
問題文
2つの整数 K(桁数)と X(割る数)が与えられます。Xで割り切れる最小のK桁の整数を求めてください。
アプローチ
この問題は、以下のシンプルな手順で解くことができます。
- まず、K桁の数のうち最小の値 MIN を求めます。MIN は「1の後に0が(K−1)個並ぶ数」、すなわち 10K−1 です(例:K=5なら 10000)。
- もし MIN を X で割った余りが 0 であれば、MIN がそのまま答えになります。
- そうでない場合は、答えは (MIN + X) − ((MIN + X) % X) で計算できます。
この方法が成り立つ理由は、MIN から MIN + X までの範囲内に必ず X の倍数が1つ存在するためです。つまり、MIN + X を超えない最大の X の倍数を求めればよいことになります。
実装例
それでは、実際のコードを見てみましょう。
def answer(k, x):
# K桁の数の最小値を計算
min_num = pow(10, k - 1)
if min_num % x == 0:
return min_num
else:
# Xの倍数へ切り上げ
return ((min_num + x) - ((min_num + x) % x))
x = 83 # 割る数
k = 5 # 桁数
print(answer(k, x))出力
10043
処理の流れを確認
上記の例では、K = 5、X = 83 として実行しています。処理の流れを追ってみましょう。
- K桁の最小値 MIN は 105−1 = 10000
- 10000 ÷ 83 の余りは 40 なので 0 ではない → 手順3へ進む
- (10000 + 83) − (10083 % 83) = 10083 − 40 = 10043
実際に 10043 ÷ 83 = 121 となり、余りなく割り切れることが確認できます。また、10043 より小さい5桁の数で 83 で割り切れるものは存在しないため、これが正しい答えです。
別の書き方(ワンライナー)
Pythonでは、切り上げ除算のテクニックを使うと、同じ処理を1行で簡潔に書くこともできます。
x, k = 83, 5 print(((10 ** (k - 1) + x - 1) // x) * x)
こちらも同じ結果「10043」が出力されます。
まとめ
この記事では、Xで割り切れる最小のK桁の数を求めるアプローチについて学びました。ポイントは、「K桁の最小値 10K−1 を基準にし、そこから最も近い X の倍数へ切り上げる」という考え方です。剰余演算を一度使うだけで答えが求まるため、計算量は O(1) と非常に効率的で、桁数や X が大きくなっても高速に動作します。
-
n番目のフィボナッチ数を求めるPythonプログラム【再帰・動的計画法】
本記事では、n番目のフィボナッチ数を計算するPythonプログラムについて解説します。フィボナッチ数とは?フィボナッチ数とは、次の漸化式で定義される数列のことです。Fn = Fn-1 + Fn-2ただし、初期値は F0 = 0、F1 = 1 とします。フィボナッチ数列の最初のいくつかの値は以下の通りです。0, 1, 1, 2, 3, 5, 8, 13, ..................フィボナッチ数は、再帰と動的計画法(Dynamic Programming)という2つの代表的な手法で求めることができます。それでは、それぞれの実装方法をPythonスクリプトで見ていきましょう。方法1:再帰
-
Pythonでn番目のカタラン数を計算するプログラム|再帰法と動的計画法
本記事では、n番目のカタラン数を計算する方法について解説します。 カタラン数(Catalan number)は、次の漸化式で定義される自然数の数列です。 $$C_{0}= 1,\quad C_{n+1}=\displaystyle\sum\limits_{i=0}^n C_{i}C_{n-i}\quad (n \geq 0)$$ n = 0, 1, 2, 3, … に対するカタラン数は、1, 1, 2, 5, 14, 42, 132, 429, … と続きます。 カタラン数は、再帰法と動的計画法のどちらのアプローチでも求めることができます。それでは、それぞれの実装方法を見ていきましょう。 方法