Треугольник с помощью цикла do-while

Нужно решить задачу, нарисовать треугольник из долларов, есть условия:

  1. Цикл только do while.
  2. Не более двух циклов.

введите сюда описание изображения

У меня получается пока только нижняя часть рисунка, и через while:

int n = 3; 
int i = n, j = 1; 
while (i >= 1) { 
    while (j <= i) { 
        System.out.print(" " + "#"); 
        j++; 
    } 
    System.out.println(""); 
    j = 1; 
    i--; 
}

Ответы (1 шт):

Автор решения: Nowhere Man

Если используется отдельный цикл для поэлементного вывода каждой строки, как в представленном решении, то придётся завести ещё несколько переменных:

  • общее количество строк будет вычисляться по формуле m = 2 * n - 1
  • текущая "ширина" строки, которая может как увеличиваться, так и уменьшаться
  • соответственно, "приращение ширины", которое может принимать значения 1, -1 Получится что-то вроде:
int 
    n = 3,         // "высота" треугольника (максимальная ширина)
    m = 2 * n - 1, // общее количество строк
    i = 1,         // счётчик строк (от 1) 
    d = 1,         // "приращение"
    w = 1;         // ширина строки
do {
    int j = 0;     // счётчик элементов текущей строки

    do {
        System.out.print("$");
    } while (++j < w);
    System.out.println();

    // достигли максимальной ширины, начинаем уменьшать текущую ширину
    if (i == n) d = -1;
    w += d;
} while (++i <= m);

Если можно использовать метод для генерации строк String::repeat, добавленный в Java 11, то можно будет обойтись технически одним циклом, определив отдельный метод:

public static void printTriangleOneLoop(int n, String str) {
    int i = 0, d = 1, w = 1, m = 2 * n - 1;
    do {
        System.out.println(str.repeat(w));  // вывод строки с текущей шириной
        if (++i == n) d = -1;               // достигли максимума
        w += d;
    } while (i < m);
}

Или же можно использовать последовательно два цикла без дополнительных переменных и логики, в первом ширина будет увеличиваться, во втором, соответственно, уменьшаться:

public static void printTriangleTwoLoops(int n, String str) {
    int i = 0;
    do {
        System.out.println(str.repeat(++i));
    } while (i < n);
    do {
        System.out.println(str.repeat(--i));
    } while (i > 1);
}
→ Ссылка