Печатать ниже серии в одиночном l oop и используя только одну переменную - PullRequest
0 голосов
/ 01 февраля 2020

Я пытаюсь бесконечно напечатать следующую последовательность:

0   100
1    99
2    98
.     .
.     .
.     .
97    3 
98    2
99    1
100   0 
99    1
98    2
97    3
.     .
.     .
.     . 
3     97
2     98
1     99
0     100
.      .
.      .
.      .

Однако, когда я запускаю это, шаблон печатается только один раз.

Вот мой код:

public class PrintSequence {
    public static void main(String args[]) {
        int i=0;
        while(true) 
        {
            if(i<=100) {
                System.out.println(i+ "   " + (100-i));    
                i++;
            }

        }

    }
}

Назначение позволяет мне использовать только одну l oop и одну переменную.

Ответы [ 2 ]

1 голос
/ 02 февраля 2020

Вы можете сделать это следующим образом:

public class Main {
    public static void main(String[] args) {
        int i = 0;
        while (true) {
            if (i <= 100) {
                System.out.println(i + "\t" + (100 - i));
                i++;
            } else if (i <= 200) {
                System.out.println((200 - i) + "\t" + (i - 100));
                i++;
            }
            if (i == 200) {
                i = 0;
            }
        }
    }
}

Существенные особенности:

  1. Это точно соответствует вашим требованиям.
  2. Это не требует никакой библиотеки.
1 голос
/ 01 февраля 2020

Для решения этой проблемы необходимы 2 уловки:

  • Поймите, что полный цикл от 0,100 до 0,100 составляет 200 итераций, затем используйте оператор % остаток для написать бесконечное l oop в диапазоне 0-199.

  • Используйте Math.abs() 1 , чтобы превратить отрицательное число в положительное число.

Вот 2 строки кода, которые будут давать желаемый бесконечный вывод:

for (int i = 0; ; i = (i + 1) % 200)
    System.out.printf("%-6d%d%n", 100 - Math.abs(100 - i), Math.abs(100 - i));

Пояснение

for (;;) - это все oop, которое работает «навсегда» ( бесконечно ). Это то же самое, что и for (; true; ), и то же самое, что и while (true), но использование for позволяет хранить int i = 0, l oop и i = (i + 1) % 200 вместе в одной строке кода.

i = (i + 1) % 200 означает, что когда i = 199, следующее значение равно i = 0, начиная последовательность заново, навсегда повторяя значения 0..199.

100 - i делает последовательность 0 .. 199 становится 100 ..- 99.

Math.abs(100 - i) делает последовательность равной 100..0..99, то есть второму столбцу выходных данных.

100 - Math.abs(100 - i) делает последовательность равной 0..100..1, т. Е. Первый столбец вывода.

printf("%-6d%d%n", ...) позволяет печатать красиво в 2 столбца.


1) Если Math.abs() не допускается, вместо этого используйте троичный условный оператор ?::
printf("%-6d%d%n", (i < 100 ? i : 200 - i), (i < 100 ? 100 - i : i - 100))

...