2

编写一个程序,提示用户输入一个从 1 到 15 的整数并显示一个金字塔,如以下示例运行所示:

            1

          2 1 2

        3 2 1 2 3

      4 3 2 1 2 3 4 

    5 4 3 2 1 2 3 4 5

  6 5 4 3 2 1 2 3 4 5 6 

7 6 5 4 3 2 1 2 3 4 5 6 7

我有以下内容:

num = eval(raw_input("Enter an integer from 1 to 15: "))

if num < 16:

      for i in range(1, num + 1):
          # Print leading space
          for j in range(num -  i,  0,  -1):
               print(" "),
          # Print numbers      
          for j in range(i, 0, -1):
               print(j),
          for j in range(2, i + 1):
               print(j),
           print("") 
else: 
 print("The number you have entered is greater than 15.")

对于大于或等于 10 的数字,这会产生错位。

我试过 print(format(j, "4d")) 并且所有的数字都没有对齐。

有小费吗?谢谢。

4

6 回答 6

2

为数字使用前导空格(“01” - “09”、“10”、...)

num = eval(raw_input("Enter an integer from 1 to 15: "))                                                                                           

def as_str(i):
    s = ""
    if i <10: s = " "
    return s + str(i)


#num = 15                                                                                                                                           

allrows = ""
for j in range(1,num+2):

    #leading spaces                                                                                                                                 
    row = " "*3*(num-j+1)

    #backward                                                                                                                                       
    for i in range(j-1,1,-1):
        s = as_str(i)
        row+=s + " "

    #forward                                                                                                                                        
    for i in range(1,j):
        s = as_str(i)
        row+=s + " "


    row +="\n"
    allrows +=row

print allrows

输出

                                           1 
                                        2  1  2 
                                     3  2  1  2  3 
                                  4  3  2  1  2  3  4 
                               5  4  3  2  1  2  3  4  5 
                            6  5  4  3  2  1  2  3  4  5  6 
                         7  6  5  4  3  2  1  2  3  4  5  6  7 
                      8  7  6  5  4  3  2  1  2  3  4  5  6  7  8 
                   9  8  7  6  5  4  3  2  1  2  3  4  5  6  7  8  9 
               10  9  8  7  6  5  4  3  2  1  2  3  4  5  6  7  8  9 10 
            11 10  9  8  7  6  5  4  3  2  1  2  3  4  5  6  7  8  9 10 11 
         12 11 10  9  8  7  6  5  4  3  2  1  2  3  4  5  6  7  8  9 10 11 12 
      13 12 11 10  9  8  7  6  5  4  3  2  1  2  3  4  5  6  7  8  9 10 11 12 13 
于 2012-10-25T21:43:04.523 回答
1

使用字符串格式,它适用于任何值n>=1

num=int(raw_input())

max_width=len(" ".join(map(str,range(num,0,-1)))+" ".join(map(str,range(2,num+1))))+1
#max_width is the maximum width, i.e width of the last line

print "{0:^{1}}".format("1",max_width)      #print 1 , ^ is used to place the
                                            #string in the center of the max_width
for i in range(2,num+1):   #print rest of the numbers from 2 to num
    range1=range(i,0,-1)
    strs1=" ".join(map(str,range1))
    range2=range(2,i+1)
    strs2=" ".join(map(str,range2))
    print "{0:^{1}}".format(" ".join((strs1,strs2)),max_width) # use ^ again with max_width

输出:

monty@monty-Aspire-5050:~$ python so27.py
5
        1        
      2 1 2      
    3 2 1 2 3    
  4 3 2 1 2 3 4  
5 4 3 2 1 2 3 4 5
monty@monty-Aspire-5050:~$ python so27.py
10
                   1                   
                 2 1 2                 
               3 2 1 2 3               
             4 3 2 1 2 3 4             
           5 4 3 2 1 2 3 4 5           
         6 5 4 3 2 1 2 3 4 5 6         
       7 6 5 4 3 2 1 2 3 4 5 6 7       
     8 7 6 5 4 3 2 1 2 3 4 5 6 7 8     
   9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9   
10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10
monty@monty-Aspire-5050:~$ python so27.py
20
                                                 1                                                 
                                               2 1 2                                               
                                             3 2 1 2 3                                             
                                           4 3 2 1 2 3 4                                           
                                         5 4 3 2 1 2 3 4 5                                         
                                       6 5 4 3 2 1 2 3 4 5 6                                       
                                     7 6 5 4 3 2 1 2 3 4 5 6 7                                     
                                   8 7 6 5 4 3 2 1 2 3 4 5 6 7 8                                   
                                 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9                                 
                              10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10                              
                           11 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11                           
                        12 11 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11 12                        
                     13 12 11 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11 12 13                     
                  14 13 12 11 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11 12 13 14                  
               15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15               
            16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16            
         17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17         
      18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18      
   19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19   
20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
于 2012-10-25T22:01:43.127 回答
0

这是更紧凑的解决方案:

num = eval(raw_input("Enter an integer from 1 to 15: "))                                                                                           
allrows = ""
for j in range(1,num+2):

    #leading spaces                                                                                                                                 
    formatter = lambda x: str(x).ljust(3)
    #shift to left
    row =  " "*4*(num+2-j)
    #count backward
    row+=" ".join(map(formatter, range(1,j)[-1::-1])) + " "
    #count forward
    row+= " ".join(map(formatter, range(2,j))) + '\n'
    allrows +=row

print allrows

此代码输出:

                                            1   
                                        2   1   2  
                                    3   2   1   2   3  
                                4   3   2   1   2   3   4  
                            5   4   3   2   1   2   3   4   5  
                        6   5   4   3   2   1   2   3   4   5   6  
                    7   6   5   4   3   2   1   2   3   4   5   6   7  
                8   7   6   5   4   3   2   1   2   3   4   5   6   7   8  
            9   8   7   6   5   4   3   2   1   2   3   4   5   6   7   8   9  
        10  9   8   7   6   5   4   3   2   1   2   3   4   5   6   7   8   9   10 
    11  10  9   8   7   6   5   4   3   2   1   2   3   4   5   6   7   8   9   10  11 
12  11  10  9   8   7   6   5   4   3   2   1   2   3   4   5   6   7   8   9   10  11  12 
于 2012-10-25T22:04:22.343 回答
0

num = eval(raw_input("输入一个 1 到 15 的整数:"))

如果数字 < 16:

for i in range(1, num + 1):
    # Print leading space
    for j in range(num -  i,  0,  -1):
        print("    "),
    # Print numbers      
    for j in range(i, 0, -1):
        print(format(j, "4d")),
    for j in range(2, i + 1):
        print(format(j, "4d")),
    print

else: print("您输入的数字大于15。")

于 2012-10-26T09:43:12.940 回答
0

这不是代码高尔夫条目,但它确实显示了两个基地。注意十进制版本有 3 个空格缩进,而十六进制版本只有 2 个空格缩进。

def triangle(n):
    def indent(i):
        return ' '*3*(n-(i+1))
    def row(i):
        lhs = ['%2d' % j for j in range(i,0,-1)]
        rhs = lhs[:-1]
        rhs.reverse()
        return lhs+rhs
    rows = [indent(i)+' '.join(row(i)) for i in range(n)]
    return '\n'.join(rows)

def triangle_hex(n):
    def indent(i):
        return ' '*2*(n-(i+1))
    def row(i):
        lhs = ['%x' % j for j in range(i,0,-1)]
        rhs = lhs[:-1]
        rhs.reverse()
        return lhs+rhs
    rows = [indent(i)+' '.join(row(i)) for i in range(n)]
    return '\n'.join(rows)

if __name__=='__main__':
    print triangle(11)
    print triangle_hex(15)
于 2012-10-25T22:14:46.083 回答
0

这是最干净,最快捷的方法:

num = 5
space = " "

for i in range(1, num+1):
    for num_of_spaces in range(i+1, 1, -num):
        x = (i-1)
        spaces = space*(num-x)
        print(spaces, end="")
    for inv_rec in range(i, 1, -1):
        print(inv_rec, end="")
    for rec in range(1, i+1):
        print(rec, end="")
    print("")

输出是:

    1
   212
  32123
 4321234
543212345

65432123456 7654321234567 876543212345678

进程以退出代码 0 结束

于 2018-06-26T12:34:19.640 回答