Как построить пирамиду в Java - PullRequest
2 голосов
/ 15 октября 2019

Как мне построить пирамиду, используя программу цикла, учитывая количество строк, введенных пользователем? Например,

   *
  ***
 *****
*******

Я пытался просмотреть несколько видео и прочитать статьи о логике этого, но преподаватели либо не поняли, либо пропустили рассуждения.

Я знаю каждую строкуувеличивается на 2 звезды, и я знаю, что, поскольку каждая строка имеет нечетное число звезд, я могу определить количество звезд в строке как 2n + 1, где n - целое число. Я заметил, что двухрядный треугольник имеет основание из 3 звезд, трехрядный треугольник имеет основание из 5 звезд и так далее. Таким образом, для n-й строки основание треугольника равно n + (n-1), то есть 2n-1. Например, r_5: base = 9 звезд. Следующая вещь, которую я знаю, что моя программа должна рассмотреть, является интервалом. Я заметил, что от основания интервал увеличивается на 2 в каждом ряду, пока у нас не будет n-1 пробелов в первой половине и еще n-1 пробелов во второй половине, другими словами, интервал увеличивается от базы до тех пор, пока он не станет больше илиравен 2b-2.

Я думаю, что все, что охватывает суть Java-программы, нужно знать: количество звезд в ряду, размер основания и расстояние. Но как мне перевести все это в цикл for while?

Ответы [ 3 ]

4 голосов
/ 15 октября 2019

Метод 1

Обратите внимание, что если мы обозначим текущий номер строки как «строку», начиная с 0, а общее количество строк как «n»,

Количество звезд в каждой строке = 2 * строка + 1

Количество начальных (или конечных) пробелов в каждой строке = n - строка - 1

Мы можем просто сгенерировать пирамиду, используя это правило:

int n = 4;
for (int line = 0; line < n; line++) {
    StringBuilder sb = new StringBuilder();
    int starsToAppend = 2 * line + 1;
    int spaceToAppend = n - line - 1;

    while (spaceToAppend-- > 0) sb.append(" ");
    while (starsToAppend-- > 0) sb.append("*");

    System.out.println(sb.toString());
}

Метод 2

Вы также можете подходить с середины и расширяться. Обратите внимание, что в центре есть постоянный столбец звезды (*), и с каждой стороны в каждую строку добавляется только одна звезда. А остальные пробелы.

int n = 4;
for(int line=0; line <n ; line++){
    StringBuilder sb = new StringBuilder("*");
    int spacesToAppendOnBothSides = n-line-1;
    int starsToAppendOnBothSides = line;

    for(int idx=0; idx<starsToAppendOnBothSides; idx++){
        sb.insert(0, "*");  //appends to the beginning
        sb.append("*");     //appends to the end
    }
    for(int idx=0; idx<spacesToAppendOnBothSides; idx++){
        sb.insert(0, " ");
        sb.append(" "); //NOTE: You may exclude this line to avoid adding trailing spaces
    }
    System.out.println(sb.toString());
}

Объяснение: На первой итерации (строка == 0) 1. Возьмем одну звезду,

*

и добавьте ноль лишних звездочек (поскольку наша строка # равна нулю) с обеих сторон, что дает нам (та же строка):

*

А затем добавьте n-строку-1 (мы вычтем 1, потому что мы уже добавили 1 символ - первую звезду) = 3 пробела с каждой стороны этой звезды, что дает нам:

. .. * ...

На 2-й итерации (строка == 1), если мы применяем ту же логику: 1.

*

2.

***
 ^ This middle one is the first star

3.

..***..

Довольно просто, когда вы понимаете логику. Есть несколько способов сделать это, но они являются одними из самых простых:)

1 голос
/ 15 октября 2019

Скажем, вам нужно напечатать пирамиду из n строк. Вы можете видеть, что строка i (где i находится между 1 и n) начинается с n-i пробелов и имеет (i-1)*2+1 звездочек:

    for (int i = 1; i <= n; ++i) {
        int spaces = n-i;
        int stars = (i-1)*2+1;
        for (int j = 1; j <= spaces; ++j) {
            System.out.print(' ');
        }
        for (int j = 1; j <= stars; ++j) {
            System.out.print('*');
        }
        System.out.println();
    }
0 голосов
/ 15 октября 2019

Вот моя реализация -

public static String repeat(String str, int times) {
    return new String(new char[times]).replace("\0", str);
}

public void createPyramid(int size) {
    for (int i = 1; i <= size; i += 2) {
        int numSpaces = (size - i) / 2;
        System.out.println(repeat(" ", numSpaces) + repeat("*", i) + repeat(" ", numSpaces));
    }
}

Вызовите метод, так как - createPyramid(7); должен дать желаемый результат. Вы можете увеличить размер для большей пирамиды.

Переменная, которую я итерирую для размера пирамиды. И количество звезд в каждой строке увеличивается на 2, начиная с 0. Там я увеличиваю на 2. Пробелы будут равны size - number of *'s, но их нужно повторять до и после симметрично *, мы делимэто на 2. Это даст количество пробелов до и после *, а в середине нам просто нужно напечатать *, чье число задано i. Итак, мы наконец напечатали их. Функция повтора создает строку, сформированную из параметра str, повторенного times раз. Например, если мы вызовем repeat("abc", 3), он вернет «abcabcabc».

...