Pythonでn行の回文三角形を出力するプログラム
数値 n が与えられたとき、n行からなる三角形を出力することを考えます。ただし、各行は回文(左から読んでも右から読んでも同じ並びになる数字列)である必要があります。
例えば、入力が n = 5 の場合、期待される出力は次のとおりです。
1 121 12321 1234321 123454321
解き方のアプローチ
この問題は、数学的な性質を利用すると非常にシンプルに解けます。手順は以下のとおりです。
- 1 から n までの各 i に対して、以下を繰り返す
- ((10i − 1) ÷ 9) の整数部分を求め、その2乗を表示する
- 改行する
ここで重要なのは、(10i − 1) ÷ 9 が「111…1」というように 1 が i 個並んだ数(レピュニット)になる点です。このレピュニットを2乗すると、不思議なことに「123…321」という回文が現れます。
例えば i = 3 の場合を見てみましょう。
- (10³ − 1) ÷ 9 = 999 ÷ 9 = 111
- 111 × 111 = 12321
実装例
それでは、実際のコードを見てみましょう。
def solve(n):
for i in range(1, n + 1):
print((((10**i) - 1) // 9)**2)
n = 8
solve(n)入力
8
出力
1 121 12321 1234321 123454321 12345654321 1234567654321 123456787654321
まとめ
このプログラムは、ループごとに文字列を組み立てる代わりに、レピュニットの2乗という算術的な性質を活かしているため、コードが1行で済み、非常にエレガントです。計算量も O(n) と効率的で、n が大きくなっても高速に動作します。
-
Pythonで文字列が回文かどうかを判定するプログラム
問題概要 文字列 s が与えられたとき、その文字列が回文(パリンドローム)であるかどうかを判定します。回文とは、前から読んでも後ろから読んでも同じになる文字列のことです。 たとえば、入力が s = racecar の場合、「racecar」を逆から読んでも「racecar」であるため、出力は True になります。 解法のアプローチ この問題は以下の手順で解くことができます。 文字列 s を反転したものを t とする t が s と一致する場合は True を返す そうでない場合は False を返す Pythonではスライス記法 [::-1] を使うことで、文字列を簡単に反転できます。
-
Pythonで行列をZ字形に出力するプログラムの解説
本記事では、n×n の正方行列の要素を「Z」の字形に沿って出力する方法について、その考え方と実装の手順をわかりやすく解説します。 問題の概要 次数 n×n の正方行列が与えられたとき、その要素を Z 字形に従って順番に表示することが求められます。 Z 字形の走査は、以下の3つのステップで構成されます。 まず、最初の行(1行目)を左から右へ走査する 次に、主対角線(左上から右下へ向かう対角成分)を走査する 最後に、最終行(最後の行)を左から右へ走査する ここでは説明のため、あらかじめ用意した入力行列を使用して、コードの流れを示します。 サンプルコード arr = [[1, 2, 6, 9],