2

我有这个代码:

def floyd(n):
    count = 1
    string = ""
    for i in range(1,n+2):
        for j in range(1,i):
            string = string + " " + str(count)
            count = count + 1
        print(string)
        string = ""
print floyd(6) 

它打印:

1
2 3
4 5 6
7 8 9 10
11 12 13 14 15
16 17 18 19 20 21

但我希望它看起来像这样:

       1
      2 3
     4 5 6
   7 8 9 10
 11 12 13 14 15
16 17 18 19 20 21

你能帮我弄清楚怎么做吗?

4

3 回答 3

5

Python 字符串实际上有一个内置center()方法可以为您做到这一点。

print(string.center(total_width))

您可以total_width提前设置:

total_width = -1

for i in xrange(0, n):
    total_width += 1 + len(str((n + n * n) / 2 - i))

或者

total_width = sum(1 + len(str((n + n * n) / 2 - i)) for i in xrange(0, n)) - 1

即与第n个三角形数(n²+n)相同的行数的字符串表示的长度之和÷2。

这是一个演示!

于 2013-09-30T17:50:30.037 回答
2

使用n您可以首先找到最后一行,最后一个数字是(n**2 + n)/2,所以最后一行的第一个数字是((n**2 + n)/2) - (n-1),现在可以使用str.join和列表理解创建最后一行:

x = ((n**2 + n)/2)
last_row = ' '.join(str(s) for s in xrange(x-(n-1), x+1))

现在我们可以在字符串格式中使用该行的宽度来正确居中其他行。

代码:

from itertools import count
def floyd(n):
    x = ((n**2 + n)/2)
    last_row = ' '.join(str(s) for s in xrange(x-(n-1), x+1))
    width = len(last_row)
    c = count(1)
    for x in xrange(1, n):
        line = ' '.join(str(next(c)) for _ in xrange(x))
        print "{:^{}}".format(line, width)
    print last_row

演示:

>>> floyd(6)
        1        
       2 3       
      4 5 6      
    7 8 9 10     
 11 12 13 14 15  
16 17 18 19 20 21
>>> floyd(8)
           1           
          2 3          
         4 5 6         
       7 8 9 10        
    11 12 13 14 15     
   16 17 18 19 20 21   
 22 23 24 25 26 27 28  
29 30 31 32 33 34 35 36
于 2013-09-30T18:58:30.027 回答
-1
def FloydT(n):
    num=0
    row=""
    for i in range(1,n+1):
        for j in range(1,i+1):
            num+=1
            row+=str(num)+" "
        print(str.center(row,3*n)) # this line will do what you want
        row=""
于 2018-04-28T17:35:05.697 回答