Pythonで数値に5を挿入して最大の数を作るアルゴリズム
ある整数 n が与えられたとき、数字の任意の位置に「5」を挿入することで作れる最大の数を求める問題を考えてみましょう。
たとえば、入力が n = 826 の場合、「5」を挿入できる候補は「5826」「8526」「8256」「8265」の4通りあります。この中で最大となるのは 8526 であり、これが出力になります。
解法のアプローチ
この問題は、考えられるすべての挿入位置を試すシンプルな全探索で効率的に解くことができます。手順は以下の通りです。
temp: 数値 n を文字列に変換したものans: 初期値として負の無限大(float('-inf'))を設定- i を 0 から temp の長さまで順にループ処理する
cand: temp の先頭から i 文字目までの部分文字列 + 「5」+ i 文字目以降の部分文字列を連結したもの- i が 0 かつ temp[0] が「-」(負の数)の場合は、その反復をスキップする
ans: ans と cand を整数に変換した値のうち、大きい方を採用する
- ループ終了後、ans を返す
負の数を扱う際は、符号「-」の直前に「5」を挿入すると不正な文字列になってしまうため、i = 0 のケースを除外している点がポイントです。
実装例(Python)
class Solution:
def solve(self, n):
temp = str(n)
ans = float('-inf')
for i in range(len(temp) + 1):
cand = temp[:i] + '5' + temp[i:]
if i == 0 and temp[0] == '-':
continue
ans = max(ans, int(cand))
return ans
ob = Solution()
print(ob.solve(826))
入力
826
出力
8526
まとめ
数値を一度文字列に変換し、可能なすべての位置に「5」を挿入した候補を生成してその最大値を取ることで、桁数を d としたとき O(d) 個の候補から答えを求められます。負の数への対応も、符号位置への挿入をスキップするだけで簡単に実現できる、非常にシンプルかつ実用的な手法です。
-
【Python】ある数の最大の素因数を求めるプログラムの書き方
この記事では、「与えられた整数の最大の素因数を求める」という問題に対する解決方法を、具体的なコード例とともにわかりやすく解説します。 問題文 正の整数 n が与えられたとき、その数の最大の素因数を求めます。 例えば n = 15 の場合、15 は 3 × 5 と素因数分解できるため、答えは 5 となります。 解き方のアプローチ 入力された数を、小さい約数から順番に割っていくことで素因数分解します。 割り切れるたびに、その時点での約数(素因数)を「最大値」として更新していきます。 平方根まで調べれば十分なため、計算量を抑えられます。 実装例(サンプルコード) import math def
-
Pythonで階乗を計算する3つの方法|forループ・再帰・math.factorial()の使い方
階乗(factorial)の計算は、データ分析をはじめとする数学的な処理において、Pythonでよく求められる操作の一つです。階乗とは、正の整数 n に対して、1から n までのすべての整数を掛け合わせた値のことです(例:5! = 1 × 2 × 3 × 4 × 5 = 120)。この記事では、Pythonで階乗を求める3つの方法を、コード例と実行結果とともにわかりやすく解説します。方法1:forループを使うforループで1から目的の数値まで順番に処理し、各ステップで掛け算を繰り返していく方法です。以下のプログラムでは、ユーザーに数値の入力を促し、ループ処理の前にint()で入力値を整数に変換