Всем привет!
Я только недавно начал учить Java и решил сделать для себя небольшой квест, который поможет мне освоить особенности этого языка. Я переделываю свои лабораторные с C++. Случилась у меня одна загвоздка: я не могу красиво построить треугольник Паскаля. Идея состоит в том, чтобы в цикле при заполнении треугольника писать стринговую переменную из пробелов и в каждой новой строке выводить ее значение, но на один пробел меньше. Код прилагаю.
Большое вам спасибо :)
public class Paskal {
public static final int LINES = 10;
public static void main(String[] args) {
String MySpace = " ";
int[][] p = new int [LINES][];
p[0] = new int[1];
System.out.print(MySpace);
System. out. println (p[0][0] = 1);
p[1] = new int[2];
p[1][0] = p[1][1] = 1;
System.out.print(MySpace + "" );
System.out.println(p[1][0] + " " + p[1][1]);
for (int i = 2; i < LINES; i++){
p[i] = new int[i+1];
System.out.print(MySpace);
System.out.print((p[i][0] = 1) + " ");
for (int j = 1; j < i; j++)
System.out.print((p[i][j] = p[i-1][j-1] + p[i-1][j]) + " ");
System.out.println(p[i][i] = 1);
}
}
}
Ответ
Можно воспользоваться форматированным выводом (System.out.printf, String.format, java.util.Formatter и компания), тогда каждое число будет занимать фиксированное количество символов, и отступ можно будет просто посчитать. Если еще вынести вывод всей строки в отдельный метод (и заодно отделить вычисления от вывода), то даже не очень страшно выглядит:
static final int LINES = 10;
// шаблон для форматирования числа: число занимает до пяти символов, недостающие
// дополняются проблелами слева, затем один пробел
// Полный синтаксис:
// https://docs.oracle.com/javase/8/docs/api/java/util/Formatter.html#syntax
// аналогично printf в С
static final String NUMBER_FORMAT = "%5d ";
// Длина одного форматированного числа (5 знаков под число и пробел)
static final int NUMBER_STRING_LENGTH = 6;
// максимальное количество чисел в строке совпадает с количеством строк
// длина этой строки в символах = число строк * длина одного числа
static final int MAX_LINE_LENGTH = LINES * NUMBER_STRING_LENGTH;
// запас пробелов
static final String SPACES = " ";
static void printArray( int[] array ) {
// мы знаем количество чисел в строке (array.length),
// длину каждого числа в символах и длину самой длинной строки
// чтобы отцентрировать нашу строку, нужно отступить на половину
// разницы между нашей строкой и самой длинной
// SPACES.substring создает строку с нужным количеством пробелов
System.out.print( SPACES.substring( 0, (MAX_LINE_LENGTH - NUMBER_STRING_LENGTH * array.length)/2 ) );
for ( int i = 0; i < array.length; i++ )
System.out.printf( NUMBER_FORMAT, array[i] );
System.out.println();
}
public static void main(String[] args) {
int[][] p = new int[LINES][];
p[0] = new int[] {1};
printArray( p[0] );
for (int i = 1; i < LINES; i++) {
p[i] = new int[i + 1];
p[i][0] = 1;
for (int j = 1; j < i; j++)
p[i][j] = p[i - 1][j - 1] + p[i - 1][j];
p[i][i] = 1;
printArray( p[i] );
}
}
Вывод:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1
Комментариев нет:
Отправить комментарий