gpt4 book ai didi

java - 魔方代码循环

转载 作者:行者123 更新时间:2023-11-30 06:20:25 25 4
gpt4 key购买 nike

这是创建幻方的方法的代码。 n 是正方形的长度。它必须看起来像:

static int[][] magicSquare(int n) {

int[][] square=new int[n][n];

我不明白这个k=(k+1)%n;尤其是,为什么它是%n?这不是每次循环都会将 k 变为 1 吗?

for (int i=0; i<n; i++){
in k=i;
for (int j=0; j<n; j++){
square[i][j]=k+1;
k=(k+1)%n;


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

最佳答案

Java中的%用于模除。每当应用该运算符时,右侧操作数都会从左侧操作数中减去尽可能多的次数,剩下的就是输出。您可以通过将左侧操作数除以右侧操作数并将余数作为整数来轻松检查它。在 a%b 的情况下,它会像 a - (a/b)*b

以下是一些示例:

10 % 4 = 2 // 2*4 = 8 + 2 = 10
10 % 5 = 0 // 2*5 = 10 + 0 = 10
0 % 4 = 0 // result here is 0 thus 0*4 = 0 + 0 = 0
// if you try to extract 4 from 0, you will not succeed and what's left will be returned (which was originally 0 and it's still 0)...

就您而言:

k = (k + 1) % n;

确保 k 的值永远不会超过 4,因此如果它可以被 4 整除,那么它将被除,剩下的将被写在那里。在 k 恰好为 4 的情况下,您会将 0 的值写入 k 中,但由于您总是添加 k + 1,因此它会写入 1 的值。

对于初学者,我建议打印您感兴趣的值并观察数据如何迁移。在这里,我添加了一些 println 供您了解。运行代码并自行测试。我确实相信事情会变得更加干净。

public static void main(String[] args) {
int n = 4;

int[][] square = new int[n][n];

System.out.println("--------------");

for (int i = 0; i < n; i++) {

int k = i;

System.out.println("Filling magic cube line " + (i + 1) + ". The k variable will start from " + i + "."); // i initial value is 0 so we add 1 to it just to get the proper line number.

for (int j = 0; j < n; j++) {

System.out.println("Filling array index [" + i + "][" + j + "] = " + (k + 1)); // array indexes start from 0 aways and end at array.length - 1, so in case of n = 4, last index in array is 3.

square[i][j] = k + 1; // add 1 to k so the value will be normalized (no 0 entry and last entry should be equal to n).

k = (k + 1) % n; // reset k if it exceeds n value.
}

System.out.println("--------------");

}

Arrays.stream(square).forEach(innerArray -> {
Arrays.stream(innerArray).forEach(System.out::print);
System.out.println();
});
}

您可以随时尝试并重构代码,如下所示:

public static void main(String[] args) {
int n = 4;

int[][] square = new int[n][n];

System.out.println("--------------");

for (int i = 1; i <= n; i++) {

int k = i;

System.out.println("Filling magic cube line " + i + ". The k variable will start from " + i + ".");

for (int j = 0; j < n; j++) {

System.out.println("Filling array index [" + (i - 1) + "][" + (j - 1) + "] = " + k); // array indexes start from 0 aways and end at array.length - 1, so in case of n = 4, last index in array is 3. Subtract both i and j with 1 to get the proper array indexes.

square[i - 1][j - 1] = k;

k = (k + 1) % n; // reset k if it exceeds n value.
}

System.out.println("--------------");

}

Arrays.stream(square).forEach(innerArray -> {
Arrays.stream(innerArray).forEach(System.out::print);
System.out.println();
});
}

请记住,数组的索引从 0 开始,以长度 - 1 结束。在 4 的情况下,第一个索引是 0,最后一个索引是 3。这是两个实现的差异,尝试看看索引和值取决于控制变量ij

https://www.diffchecker.com/x5lIWi4A

在第一种情况下,i 和 j 都从 0 开始,一直增长,直到它们的值都小于 n,而在第二个例子中,它们从 1 开始,一直增长,直到它们等于 n。我希望现在情况变得更清楚了。干杯

关于java - 魔方代码循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48268946/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com