Java 创建一个n*n平方并使所有边的和相同
我需要一些帮助让我的代码正常工作;我是Java新手,所以请原谅我的任何错误做法。 我没有收到任何错误:Java 创建一个n*n平方并使所有边的和相同,java,Java,我需要一些帮助让我的代码正常工作;我是Java新手,所以请原谅我的任何错误做法。 我没有收到任何错误:线程“main”java.lang.ArrayIndexOutOfBoundsException中的异常:索引-1超出MagicSquare.main(MagicSquare.java:22)的长度5的界限 我不确定如何使行和列环绕 import java.util.Scanner; public class MagicSquare { public
线程“main”java.lang.ArrayIndexOutOfBoundsException中的异常:索引-1超出MagicSquare.main(MagicSquare.java:22)的长度5的界限
我不确定如何使行和列环绕
import java.util.Scanner;
public class MagicSquare {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.print("Enter an odd number: ");
int n = in.nextInt();
int[][] magicSquare = new int[n][n];
for (int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
magicSquare[i][j] = 0;
}
}
int x = 1;
int y = (n + 1) / 2;
for (int i = 0; i < (n * n); i++) {
if (magicSquare[x - 1][y - 1] == 0) {
x -= 1;
y -= 1;
}
else {
x += 1;
y = y;
}
magicSquare[x][y] = i;
}
for(int i=0; i < n; i++){
for(int j=0; j < n; j++){
System.out.print(magicSquare[i][j] + " ");
}
System.out.print("\n");
}
}
}
import java.util.Scanner;
公共级魔法广场{
公共静态void main(字符串[]args){
扫描仪输入=新扫描仪(系统输入);
System.out.print(“输入奇数:”);
int n=in.nextInt();
int[]magicSquare=新int[n][n];
对于(int i=0;i
您只需将数据设置到magicSquare
。您需要在main
方法的最末尾打印它:
for(inti=0;i您有三个问题
Java中的数组索引从0开始,而不是从1开始。因此,用0来初始化x,用(n+1)/2-1来初始化y
您需要包装索引。例如,如果移动到列-1,您必须实际移动到列n-1。或者如果将1添加到x并尝试移动到行n,您必须实际移动到行0(因为请记住,最后一行是数字n-1)
实际上,应该使用System.out.print打印构造的数组
该算法中最棘手的事情是在包装索引时提供适当的索引,以防止arrayindexoutofbounds在x
低于0或高于n-1
时出现异常
这可以通过以下方式实现:
static int[][]magicSquare(int n){
整数[][]平方=新整数[n][n];
//x和y偏移了1,因为数组索引基于0
int x=0;
int y=(n-1)/2;
平方[x][y]=1;
对于(inti=2;i=n)x=0;
}
平方[x][y]=i;
}
返回广场;
}
正方形的打印可以移动到单独的方法:
static void printSquare(int[]]square){
int maxLen=Integer.toString(square.length*square.length).length();
String format=“%”+maxLen+“d”;//打印正方形时对齐所有数字
对于(int i=0;i
测试:
publicstaticvoidmain(字符串…参数){
printSquare(magicSquare(3));
System.out.println(“==========”);
printSquare(magicSquare(5));
}
输出
6 1 8
7 5 3
2 9 4
=======
15 8 1 24 17
16 14 7 5 23
22 20 13 6 4
3 21 19 12 10
9 2 25 18 11
在调试阶段,用try{…}catch(Throwable t){t.printStackTrace();}
包围代码是很有用的,这样所有抛出的异常(如ArrayIndexOutOfBounds
)都会写入标准输出。我现在在运行该代码段时将其添加到末尾,我遇到了另一个问题。线程“main”中的异常java.lang.ArrayIndexOutOfBoundsException:索引-1超出MagicSquare.main(MagicSquare.java:22)处长度3的界限
@qosz您确定异常是由此代码引起的吗?在循环中,i
和j
从0开始,因此索引-1
不可能是accessedIt,这不是由此代码引起的,如果您能发现代码有任何问题,这是我在第22行的代码。很抱歉打扰您,我正在尝试测试您的代码出了,但我无法让它运行。我做错了什么。我不习惯使用Java。所以我将类中的所有内容都放在一个文件中,然后在关闭类之前将测试值放在末尾。这给了我以下错误:test1。Java:38:错误:方法声明无效;返回类型必需的printSquare(magicSquare(3))
测试代码应该放在main
方法中,您可以查看更新ah,我明白了,谢谢。