2012-10-25 33 views
2

编写一个程序,提示用户输入到15 1-3的整数,并显示一个金字塔,如图以下样品运行:棱锥数

  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

我试图打印(格式(J,“4D”))和所有的数字变得不对准。

任何提示? 谢谢。

+1

您可能正在寻找诸如'str(j).rjust(2,'')或'str(j).ljust(2,'')之类的东西。 –

+1

打印基数为16的数字,他们是a只需一位数字。对齐问题解决了! – Useless

回答

1

使用数字的前导空格( “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 
+0

任何建议不使用字符串? – user1775527

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 

输出:

[email protected]:~$ 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 
[email protected]:~$ 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 
[email protected]:~$ 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 
+0

有没有使用字符串的建议? – user1775527

+0

@ user1775527你的意思是没有字符串格式? –

+0

是的。因为,有没有什么小的,可以添加没有字符串格式? – user1775527

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 
+0

任何建议不使用字符串? – user1775527

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) 
0

NUM = EVAL(的raw_input(“输入的整数从1到15: ”))

如果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(format(j, "4d")), 
    for j in range(2, i + 1): 
     print(format(j, "4d")), 
    print 

否则: 打印(以下简称“ 你数“)