Создание квадрата цикла с помощью java

Полное Раскрытие: Домашнее Задание.

объяснение: я не могу понять своего учителя.

:

напишите метод под названием printSquare, которая принимает два целочисленных параметров min и max, и печатает номера в границах от min to max включительно в квадратной схеме. Квадратный узор легче понять на примере, чем объяснением, поэтому взгляните на вызовы метода sample и их в результате выхода консоли в таблица ниже. Каждая линия квадрата состоит из круговой последовательности увеличения целых чисел между min и max. Каждая строка печатает различная перестановка этой последовательности. Первая строка начинается с мин, вторая строка начинается с min + 1 и так далее. Когда последовательность в любой строке достигает max, он оборачивается назад к min. Вы может предположить, что вызывающий метод передаст min и max параметр такой, что min меньше или равно max

enter image description here

я не могу понять, как заставить числа остановиться на значении " max " и начать все сначала в середине строки.

это то, что у меня есть до сих пор, извините, но у меня проблемы с петлями.

for(int i = 0; i < row; i++)
{
    for(int d = 0; d < row; d++)
    {
        System.out.print(d+1);
    }
    System.out.println(i);
}

Я знаю, что использовал строку дважды, но это единственный способ заставить компилятор сформировать квадратную форму с циклом. Кто-нибудь хоть отдаленно понимает что я пытаюсь сделать? :/

7 ответов


это на самом деле хорошая математическая задача. Предположим:

int side = to - from + 1; /// the size/width of the square.

значение в любой точке квадрата (строка, col):

from + ((row + col) % side)

вы должны быть в состоянии поместить это в свои петли и "курить".


редактировать на основе комментария с просьбой объяснить.

фокус в том, чтобы пройти через все позиции в "матрице". Учитывая, что матрица квадратная, петли относительно просты, просто две петли (вложенные), которые пересекают система:

    final int side = to - from + 1;
    for (int row = 0; row < side; row++) {
        for(int col = 0; col < side; col++) {
            ... magic goes here....
        }
    }

теперь, в этом цикле, у нас есть переменные row и col которые представляют ячейку в матрице, которая нас интересует. Значение в этой ячейке должно быть пропорционально расстоянию от начала координат..... позвольте мне объяснить.... Если начало координат находится в левом верхнем углу (что и есть), то расстояния от начала координат:

0 1 2 3 4
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8

расстояние-это сумма строки и столбца...... (строки и столбцы начинают отсчет с 0).

значения, которые мы помещаем в каждую матрицу, ограничены фиксированным диапазоном. В приведенном выше примере с квадратом размера 5 он мог быть указан как printSquare(1,5).

значение в каждой ячейке является значением from (1 в этом примере) плюс расстояние от начала координат... наивно это выглядело бы так:

1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8
5 6 7 8 9

здесь значения в ячейке превысили предел 5, и нам нужно обернуть их вокруг... Итак, фокус в том, чтобы "обернуть" расстояния от происхождение..... и оператор "по модулю" отлично подходит для этого. Во-первых, рассмотрим исходную матрицу "исходное расстояние":

0 1 2 3 4
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8

если мы вместо этого заполним эту матрицу "остатком расстояния при делении на 5" (по модулю 5 или %5), мы получим матрицу:

0 1 2 3 4
1 2 3 4 0
2 3 4 0 1
3 4 0 1 2
4 0 1 2 3

теперь, если мы добавим этот результат по модулю к значению from (1), мы получим нашу окончательную матрицу:

1 2 3 4 5
2 3 4 5 1
3 4 5 1 2
4 5 1 2 3
5 1 2 3 4

в смысле, все, что вам нужно знать, что значение в каждой ячейке есть:

the from value plus the remainder when you divide the 'distance' by the width.

вот код, который я тестировал с:

public static final String buildSquare(final int from, final int to) {
    final StringBuilder sb = new StringBuilder(side * side);

    final int side = to - from + 1;

    for (int row = 0; row < side; row++) {
        for(int col = 0; col < side; col++) {
            sb.append( from + ((row + col) % side) );
        }
        sb.append("\n");
    }
    return sb.toString();

}

public static void main(String[] args) {
    System.out.println(buildSquare(1, 5));
    System.out.println(buildSquare(3, 9));
    System.out.println(buildSquare(5, 5));
    System.out.println(buildSquare(0, 9));
    System.out.println(buildSquare(0, 3));
}

Так как это домашнее задание, я просто даю подсказку.

Я не могу понять, как заставить числа остановиться на значении " max " и начать все сначала в середине строки.

вот один из способов сделать это.

  • создайте первое число дважды в массиве. Принимая printSquare(1, 5) пример, создайте массив int 1, 2, 3, 4, 5, 1, 2, 3, 4, 5.

  • используйте цикл для цикла через массив, начиная с нулевого элемента и заканчивая элементом 4, и еще один цикл для отображения 5 цифр (max-min + 1).


попробуй такое

    int i,j,k;
    for(i=min;i<=max;i++) {
        for(j=i;j<=max;j++) {
            System.out.print(j);
        }
        for(k=min;k<i;k++){
            System.out.print(k);
        }
        System.out.println();
    }

вы можете попробовать

  1. цикл от минимального значения до максимального значения и поставить все числа в массиве
  2. теперь цикл снова от минимального значения до максимального значения

    каждый раз печатайте массив и делайте круговой сдвиг (для кругового сдвига вы можете найти много примеров в SO)


Я думаю, что решение @rolfl является самым чистым. Я бы рекомендовал пойти с этим.

вы можете найти другое простое решение, заметив, что каждый вывод в вашем "квадрате" просто сдвигает первый элемент в конец списка чисел. Чтобы имитировать это, вы можете поместить все числа из min до max в структуре данных типа LinkedList или ArrayDeque где вы можете легко добавить / извлечь детали от обоих концов, тогда вы напечатали бы содержание в заказе, и shift первая запись до конца. Е. Г., coll.addLast(coll.removeFirst()). Если вы повторите этот процесс max - min + 1 раз, вы должны получить желаемый результат.


нет массива нет проблем, которые вы можете легко решить. он работает с любым диапазоном чисел.

 static void printSquare(int min, int max){
        int len = max - min + 1;
        int copy_min = min,  permanent_min = min;
        for(int i = 0; i < len; i++){
            for(int j = 0; j< len; j++){
                if(min > max)
                    if(min % len < permanent_min)
                        System.out.print((min % len )+ len);
                    else
                        System.out.print(min % len);
                else
                    System.out.print(min);
                min++;
            }
            min = ++copy_min;
            System.out.println();
        }

    }

            public static void printSquare(int min, int max)  {
                
                for (int i = min; i <= (max -min)+min; i++)  {
                    
                    for( int j =i; j <= max ; j++) {                
                        System.out.print(j);   
                        } 
                    for (int j1= min; j1<= i * 1 - 1; j1++) {
                        System.out.print(j1);
                        }
                    System.out.println();
                }
                
            }