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

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 が大きくなっても高速に動作します。

  1. Pythonで文字列が回文かどうかを判定するプログラム

    問題概要 文字列 s が与えられたとき、その文字列が回文(パリンドローム)であるかどうかを判定します。回文とは、前から読んでも後ろから読んでも同じになる文字列のことです。 たとえば、入力が s = racecar の場合、「racecar」を逆から読んでも「racecar」であるため、出力は True になります。 解法のアプローチ この問題は以下の手順で解くことができます。 文字列 s を反転したものを t とする t が s と一致する場合は True を返す そうでない場合は False を返す Pythonではスライス記法 [::-1] を使うことで、文字列を簡単に反転できます。

  2. Pythonで行列をZ字形に出力するプログラムの解説

    本記事では、n×n の正方行列の要素を「Z」の字形に沿って出力する方法について、その考え方と実装の手順をわかりやすく解説します。 問題の概要 次数 n×n の正方行列が与えられたとき、その要素を Z 字形に従って順番に表示することが求められます。 Z 字形の走査は、以下の3つのステップで構成されます。 まず、最初の行(1行目)を左から右へ走査する 次に、主対角線(左上から右下へ向かう対角成分)を走査する 最後に、最終行(最後の行)を左から右へ走査する ここでは説明のため、あらかじめ用意した入力行列を使用して、コードの流れを示します。 サンプルコード arr = [[1, 2, 6, 9],