Java 创建一个n*n平方并使所有边的和相同

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

我需要一些帮助让我的代码正常工作;我是Java新手,所以请原谅我的任何错误做法。 我没有收到任何错误:
线程“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,我明白了,谢谢。