Моя цель - java-приложение, которое берет число от пользователя. Запустите 1 и запишите его в консоль. Каждая новая строка серии будет увеличиваться на 1 до тех пор, пока не будет получен номер токена от пользователя. Важно выровнять каждую строку по правой стороне.
Scanner in = new Scanner(System.in);
int numberOfLines = in.nextInt();
for (int rows = 1; rows <= numberOfLines; rows++) {
for (int i = numberOfLines - rows; i >= 1; i--) {
System.out.print(" ");
}
for (int col = rows; col >= 1; col--) {
System.out.printf(" %d",col);
}
System.out.println();
}
1
2 1
3 2 1
4 3 2 1
5 4 3 2 1
6 5 4 3 2 1
7 6 5 4 3 2 1
8 7 6 5 4 3 2 1
9 8 7 6 5 4 3 2 1
10 9 8 7 6 5 4 3 2 1
11 10 9 8 7 6 5 4 3 2 1
при достижении двузначных чисел текст не выровнен по правому краю. Я пытался использовать условие if в цикле, но не смог этого сделать.
Честно говоря, я бы не стал беспокоиться о правильном форматировании вещей в консоли. В наши дни немногие «производственные» приложения основаны на консоли, и в других контекстах (например, на веб-страницах) есть настройки, позволяющие писать справа налево, а не слева направо.
@control выглядит как задание по программированию.
Я не вижу оператора if. Если вы не хотите показывать нам, чем мы можем вам помочь?
Ваш код отлично справляется со своей задачей. Единственная проблема, с которой вы сталкиваетесь, заключается в том, что она перестает работать должным образом, как только вы получаете числа, длина которых превышает 1 цифру: в вашем примере 10 и 11.
На самом деле это довольно сложно исправить — что, если я введу «120392»?
У вас есть несколько вариантов. Каждый вариант более удивителен, но также требует больше кода.
Если вы выберете первый или второй вариант, вы получите что-то вроде:
1
2 1
3 2 1
4 3 2 1
5 4 3 2 1
6 5 4 3 2 1
7 6 5 4 3 2 1
8 7 6 5 4 3 2 1
9 8 7 6 5 4 3 2 1
10 9 8 7 6 5 4 3 2 1
11 10 9 8 7 6 5 4 3 2 1
Обратите внимание, что здесь гораздо больше пробелов, чем в вашем примере (2 пробела между, например, каждым 4
и 3
вместо 1.
Так как? Для № 1 и № 2 вам нужен System.out.printf("%2d");
- это означает: напечатать число, но если для этого требуется менее 2 символов, левый дополнить пробелами.
Для # 1 вы жестко задаете «2» (и жестко задаете ограничение 99; альтернативно, жестко задаете 3 пробела и ограничение 999). Для # 2 вы получаете свой ввод, а затем выясняете, сколько цифр это. Что-то вроде String.valueOf(limit).length();
сделает это, затем вы создадите строку формата, используя эту длину.
Для # 3 вы отслеживаете, какое число вы не печатаете в своем цикле System.out.print(" ");
, чтобы вы могли выяснить, какой длины должно быть пустое пространство, которое вам нужно сделать: если вы не печатаете 10, вам нужно 3 пробела . Если вы не печатаете 500, вам понадобится 4. Если вы не печатаете 5, вам нужно 2.
Для № 2 и № 3: printf("%4s", "");
печатает 4 пробела. Это то, что вы использовали бы, чтобы попросить java напечатать X пробелов. Это понадобится вам для решений № 2 и № 3.
Звучит как домашнее задание первой недели. Я думаю, что № 1 является наиболее подходящим.
Вот другой способ думать об этом, используя конкатенацию строк.
Сначала вы можете сгенерировать последнюю строку, чтобы определить максимальную ширину каждой строки. Затем для каждой строки вы считаете в обратном порядке от номера текущей строки до 1, чтобы вы знали ширину только части чисел. Наконец, вы добавляете количество пробелов, необходимое для того, чтобы текущая строка была такой же ширины, как и предыдущая строка. Обратите внимание, что это ужасно неэффективное использование строк, но на самом деле я демонстрирую другой алгоритм. Если сделать эту память эффективной, ее будет труднее понять. Также обратите внимание, что правильный вывод зависит от среды, в которой вы работаете, и от того, как она отображает длинные строки. Некоторые системы добавят полосу прокрутки, в то время как другие могут привести к переносу строк.
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.print("Number of rows? ");
int numberOfLines = in.nextInt();
if (numberOfLines >= 1) {
int totalWidth = 0;
// add up the widths of the numbers themselves
for (int number = 1; number <= numberOfLines; number++) {
totalWidth = totalWidth + ("" + number).length();
}
// add in the spaces in-between the numbers
totalWidth = totalWidth + (numberOfLines - 1);
// now generate each row by counting backwards from the current row number
for (int rowNumber = 1; rowNumber<=numberOfLines; rowNumber++) {
String row = "";
for (int i=rowNumber; i>=2; i--) {
row = row + i + " ";
}
row = row + "1";
// prepend the spaces in front to make it as wide as the last row
int paddingLength = totalWidth - row.length();
for(int i=1; i<=paddingLength; i++) {
row = " " + row;
}
// output the row
System.out.println(row);
}
}
else {
System.out.println("Number of rows must be positive!");
}
}
Пример вывода с 25 строками:
Number of rows? 25
1
2 1
3 2 1
4 3 2 1
5 4 3 2 1
6 5 4 3 2 1
7 6 5 4 3 2 1
8 7 6 5 4 3 2 1
9 8 7 6 5 4 3 2 1
10 9 8 7 6 5 4 3 2 1
11 10 9 8 7 6 5 4 3 2 1
12 11 10 9 8 7 6 5 4 3 2 1
13 12 11 10 9 8 7 6 5 4 3 2 1
14 13 12 11 10 9 8 7 6 5 4 3 2 1
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
Чтобы выровнять 2 цифры по правому краю, одним из способов будет - после цикла for «col» преобразовать каждую цифру в строку, затем перевернуть ее, а затем распечатать. Если вы не преобразуете его в строку, то такие числа, как 10,20,30 и т.д., будут напечатаны как 1,2,3 и т.д.
for (int rows = 1; rows <= numberOfLines; rows++) {
for (int i = numberOfLines - rows; i >= 1; i--) {
System.out.print(" ");
}
for (int col = rows; col >= 1; col--) {
if (col>9){
COL=Integer.toString(col);
for(int i=COL.length();i>=0;i--)
rev=rev+COL.charAt(i);
System.out.printf(" %d",rev);
}
else
System.out.printf("%d",col);
}
System.out.println();
}