0

私のプログラミング クラスでは、次のシーケンスのような "ピラミッド" (IDLE で) を作成するプログラムを作成する必要があります。

              1 
            1 2 1 
          1 2 4 2 1 
        1 2 4 8 4 2 1 
      1 2 4 8 16 8 4 2 1 

それは2**(row)どこでrow = 0(最初は)行うでしょう。forループで使用します。

n5 を超える値に対して期待どおりの出力が得られないという問題が発生します。

これまでの私のコードは次のとおりです。

def pyramid(n):
   rows, num, x, numbers, space_length, i_length = 0, '', 0, {}, 0, 0
   for rows in range(n):
      x = int(len(num) / 2)
      y = str(2**rows) + ' '
      num = num[0:x + 1] + y + num[x - 1 :]
      numbers[rows + 1] = num
   space_length = int(len(numbers[n]) / 2)
   for i in numbers:
      i_length = int(space_length - (len(numbers[i]) / 2))
      numbers[i] = (' ' * i_length) + numbers[i]
      print(numbers[i])

def main():    #I have to use the function of main() because my teacher requires it.
   n = int(input("Enter an integer greater than 0: "))
   if type(n) != int or n <= 0:
      raise TypeError("N must be an integer greater than 0.")
   pyramid(n)

main()

これは私が得る出力です:

>>> 
Enter an integer greater than 0: 10
                      1 
                    1 2 1 
                  1 2 4 2 1 
                1 2 4 8 4 2 1 
              1 2 4 8 16 8 4 2 1 
           1 2 4 8 1632 16 8 4 2 1 
         1 2 4 8 1632 64 2 16 8 4 2 1  #The 2 should be 32; space between 16 and 32.
      1 2 4 8 1632 64128 64 2 16 8 4 2 1    #Same thing again; spacing messes up.
   1 2 4 8 1632 64128256 28 64 2 16 8 4 2 1 
1 2 4 8 1632 64128256512 56 28 64 2 16 8 4 2 1 

誰かがこれを修正するのを手伝ってくれるなら、それは素晴らしいことです. ありがとう!

4

3 に答える 3

1

以下に示すコードは、テストした n の値 (1 から 20) に対して正常に動作します。Python 2.7 以降では、フォーマット'{:{}}'は 2 つの項目を出力するように指示されていることに注意してください。最初の項目は出力する値で、2 番目の項目は出力するフィールド幅です (2.6 ではフィールド番号が必要になる場合があります'{0:{1}}'。 ) 式2**min(x, 2*i-x)は、1 2 4 2 1 および 1 2 4 8 16 32 64 128 64 32 16 8 4 2 1 のような、カウントアップしてからカウントダウンするシーケンスを生成するために使用されます。配列 f は、テーブル内の最大数、つまり一番下の行に対応するフィールド幅を保持します。 sum(f[:n-i])行に出力される最初の数値の前のフィールド幅の合計です。注、print ... ,form は区切りスペースを印刷し、新しい行に進みません。コードの後に​​いくつかの出力例を示します。

def pyramid(n):
    f = [1+len(str(2**min(i, 2*n-i-2))) for i in range(1+2*n)]
    for i in range(n):
        for x, w in zip(range(1+2*i), [sum(f[:n-i])]+f[n-i:]):
            print '{:{}}'.format(2**min(x, 2*i-x), w-1),
        print

pyramid(5)
pyramid(10)
for i in range(21):
    pyramid(i)

n=15 の出力例:

                                                     1
                                               1     2    1
                                          1    2     4    2    1
                                     1    2    4     8    4    2    1
                                1    2    4    8    16    8    4    2    1
                           1    2    4    8   16    32   16    8    4    2   1
                       1   2    4    8   16   32    64   32   16    8    4   2   1
                   1   2   4    8   16   32   64   128   64   32   16    8   4   2   1
               1   2   4   8   16   32   64  128   256  128   64   32   16   8   4   2  1
            1  2   4   8  16   32   64  128  256   512  256  128   64   32  16   8   4  2  1
         1  2  4   8  16  32   64  128  256  512  1024  512  256  128   64  32  16   8  4  2  1
      1  2  4  8  16  32  64  128  256  512 1024  2048 1024  512  256  128  64  32  16  8  4  2 1
    1 2  4  8 16  32  64 128  256  512 1024 2048  4096 2048 1024  512  256 128  64  32 16  8  4 2 1
  1 2 4  8 16 32  64 128 256  512 1024 2048 4096  8192 4096 2048 1024  512 256 128  64 32 16  8 4 2 1
1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 8192 4096 2048 1024 512 256 128 64 32 16 8 4 2 1

編集:以下は、読みやすさを向上させるために中間変数と2つの関数が導入された、プログラムのわずかに長いバージョンです。

def pyramid(n):
    def fieldsize(m):
        return 1+len(str(m))
    def numbers(m):
        return [2**min(j, 2*m-j) for j in range(1+2*m)]
    widths = [fieldsize(x) for x in numbers(n-1)]
    for i in range(n):
        wides = [sum(widths[:n-i])] + widths[n-i:]
        for v, w in zip(numbers(i), wides):
            print '{:{}}'.format(v, w-1),
        print

for i in range(21):
    pyramid(i)
于 2012-12-05T06:18:44.623 に答える
1

これはあなたが探しているものですか?

def pyramid(n):
   rows, num, x, numbers, space_length, i_length = 0, '', 0, {}, 0, 0
   for rows in range(n):
      x = int(len(num) / 2)
      y = str(2**rows) + '  '
      num = num[0:x + 2:] + y + num[x - 1:]
      numbers[rows + 1] = num
   space_length = int(len(numbers[n]) / 2)
   for i in numbers:
      i_length = int(space_length - (len(numbers[i]) / 2))
      numbers[i] = (' ' * i_length) + numbers[i]
      print(numbers[i])

def main():    #I have to use the function of main() because my teacher requires it.
   n = int(input("Enter an integer greater than 0: "))
   if type(n) != int or n <= 0:
      raise TypeError("N must be an integer greater than 0.")
   pyramid(n)

main()

出力:

                                1  
                             1  2  1  
                          1  2  4  2  1  
                       1  2  4  8  4  2  1  
                   1  2  4  8  16  8  4  2  1  
                1  2  4  8  16  32  6  8  4  2  1  
            1  2  4  8  16  32 64  32  6  8  4  2  1  
        1  2  4  8  16  32 64  128  4  32  6  8  4  2  1  
    1  2  4  8  16  32 64  128 256  28  4  32  6  8  4  2  1  
1  2  4  8  16  32 64  128 256 512  56  28  4  32  6  8  4  2  1  
于 2012-12-05T03:07:15.057 に答える
0

バグは、ループごとに文字列「num」をクリアする必要があり、文字列注入の終了位置が間違っていることです

文字列の連結にリストを使用することをお勧めします

a = [1, 2, 4, 2, 1]
s = ' '.join([str(x) for x in a])  
于 2012-12-05T03:02:34.250 に答える