Создание квадрата цикла с помощью java
Полное Раскрытие: Домашнее Задание.
объяснение: я не могу понять своего учителя.
:напишите метод под названием
printSquare
, которая принимает два целочисленных параметровmin
иmax
, и печатает номера в границах отmin
tomax
включительно в квадратной схеме. Квадратный узор легче понять на примере, чем объяснением, поэтому взгляните на вызовы метода sample и их в результате выхода консоли в таблица ниже. Каждая линия квадрата состоит из круговой последовательности увеличения целых чисел междуmin
иmax
. Каждая строка печатает различная перестановка этой последовательности. Первая строка начинается с мин, вторая строка начинается сmin + 1
и так далее. Когда последовательность в любой строке достигаетmax
, он оборачивается назад кmin
. Вы может предположить, что вызывающий метод передастmin
иmax
параметр такой, чтоmin
меньше или равноmax
я не могу понять, как заставить числа остановиться на значении " 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();
}
вы можете попробовать
- цикл от минимального значения до максимального значения и поставить все числа в массиве
-
теперь цикл снова от минимального значения до максимального значения
каждый раз печатайте массив и делайте круговой сдвиг (для кругового сдвига вы можете найти много примеров в 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();
}
}