2013-09-30 4 views
1

у меня есть этот код:Флойда треугольник

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 

вы поможете мне, как это сделать так? Pls

+0

Строка, начиная с 7 выглядит смещена от центра ко мне. Это два пространства от левого края следующего ряда и четыре пространства от правого края. Не следует ли выровнять 7, чтобы он лежал над «1» в «12»? – Kevin

ответ

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.

Here’s a demo!

1

Использование 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 
0

Попробуйте ...

импорт java.util.Scanner;

общественного класса Main {

public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    boolean status =true; 
    while(status){ 

    int a,b,c,num=1; 
    Scanner scn = new Scanner(System.in); 
    System.out.println("Enter how may row you want"); 
    c = scn.nextInt(); 
    System.out.println("Process done "); 
    for (a=1; a <= c ;a++) 
    { 
     for(b=1 ; b <= a;b++) 
     { 
      System.out.print(num+" "); 
      num++; 
     } 
     System.out.println(); 

    } 
    System.out.println("Do you want to continue?"); 
    String answer = scn.next(); 


    if(answer.equalsIgnoreCase("y")){ 
     status = true;} 
    if(answer.equalsIgnoreCase("n")){ 
     System.out.println("Good bye..."); 
     System.exit(0); 
    } 
} 

}}

Смежные вопросы