这是我们在计算机科学课程中处理2D数组的作业。我试图理解代码,但是不幸的是,我很难理解一些代码。这是我们提供的代码:
public class Magic {
public static void main(String[] args) {
// Initializing a variable named n and assigning the integer 3 to it
int n = 3;
// Initializing a multi-dimensional array with 3 rows and 3 columns max
int m[][] = new int[n][n]; // 3 by 3
int i, j;
// Assigning 1 to variable num
int num = 1;
int nn = n * 3 / 2; //4
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
m[(j - i + nn) % n][(i * 2 - j + n) % n] = num++;
System.out.println(num);
} // next j
} //next i
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
System.out.print(m[i][j] + "\t");
} // next j
System.out.println();
} //next i
} //end main()
} //end class Magic
现在我的问题是我不理解以下代码片段:
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
m[(j - i + nn) % n][(i * 2 - j + n) % n] = num++;
}
}
这行代码在循环中做什么?我不确定为什么在此行中还会使用模数。是否有限制生成数字的范围?
m[(j - i + nn) % n][(i * 2 - j + n) % n] = num++;
答案 0 :(得分:1)
您可以通过查看生成的魔术方块来获得一个想法,就像这样:
8 3 4
1 5 9
6 7 2
第一个坐标(其中i = 0和j = 0)分别为4%3 = 1和3%3 = 0。对于下一个坐标,j增加1,并使坐标左移一下。模运算符可确保坐标停留在正方形内。 j增3倍后,i增1且j重置为0,因此,每三步移动就直接向右移动。九步走后,广场就满了。
答案 1 :(得分:1)
m
是“多维”数组(实际上只是一个数组),大小为n
x n
,因此该数组的最大索引为{{1 }}和n-1
(因为索引从0开始)。
一种安全地索引到n-1
的聪明方法是使用模运算符m
。您可以将%
除以a % b
的结果视为“余数”(有关Java的模运算符here的更多信息)。
当您在a / b
和a % b
处执行a >= 0
时,结果总是严格小于b > 0
。因此,在我们的情况下,模数用于索引到b
中,该数字严格小于m
(这是我们想要的,否则我们将获得一些超出范围的异常!)< / p>