这个java魔方阵应该怎么做呢

将1--n^2的自然数摆成n行n列的方阵,要求每一行、每一列、二条对角线上的数加起来都相等,这样的方阵称为n阶魔方阵.例如:3阶魔方阵如下:
4 3 8
9 5 1
2 7 6
将1--n^2依次摆放成魔方阵的规律如下:
1.将1放在中间行,最右边列;
2.下一个数放在上一个数的右下角,如右下角已经放有数则放在上一个数的左边.
编程输出任意n阶魔方阵.

参考:

import java.util.Scanner;
 
public class n阶魔方阵 {
        private static void Magic(int n) {
            int mat[][] = new int[n][n];
            int i = 0, j = n / 2;    //将1放在第一行中间列
            for (int k = 1; k <= n * n; k++) {    //对n*n个空位置的魔方填入数据
                mat[i][j] = k;
                if (k % n == 0) {        //下一位有数字,每三次产生一次下一位有数字
                    i = (i + 1) % n;    //下一位在下一行
                } else {        
                    i = (i - 1 + n) % n;    //在没到边界时,每次i减一,+n为了防止出现负数
                    j = (j + 1) % n;        //每n个数换一列
                }
            }
            for (i = 0; i < mat.length; i++) {        //输出魔方阵
                for (j = 0; j < mat[i].length; j++) {
                    System.out.print(mat[i][j] + "\t");
                }
                System.out.println();
            }
        }
 
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        Magic(n);
    }
}
//运用Java二维数组打印“魔方阵”。
//所谓魔方阵是指这样的矩阵,
//它的每一行、每一列和对角线之和均相等.
//要求打印1~25之间由自然数构成的魔方阵。
public class Csj03 {
    public static void main(String[] args) {
        //定义
        int i, j, k;
        int[][] arr =new int[5][5];
        //对数组赋初值
        for (i = 0; i < 5; i++) {                     
            for (j = 0; j < 5; j++) {
                arr[i][j] = 0;                       /* 先令所有元素都为0 */
            }
        }                                          /*
                                                     * 一般数值型变量为0; 字符(串)为空或space。 
        //1先处理                                             * 良好的编程习惯是自己对数组置初值,不要用默认的方法,这样可以提高程序在不同开发系统中得兼容性。*/                                                     
        j = 2;                            
        arr[0][j] = 1;                             /* 将1放在第一行中间一列 */
        //对剩下的数处理                                  
        for (k = 2; k <= 25; k++) {                              /* 再从2开始处理 */                
            i = i - 1;                                           //总体规律/* 存放的行比前一个数的行数减1 */
            j = j + 1;                                           /* 存放的列比前一个数的列数加1 */
                if ((i < 0) && (j == 5)) {                        // 特殊情况    /* 前一个数是第一行第N列时,把下一个数放在上一个数的下面 */            
                    i = i + 2;
                    j = j - 1;
            } else {
                if (i < 0)                                       //处理方法:    /* 当行数减到第一行,返回到最后一行 */
                        i = 4;
                if (j > 4 )                                           /* 当列数加到最后一行,返回到第一行 */
                        j = 0;
            }
            if (arr[i][j] == 0) {                                     /* 如果该元素为0,继续执行程序 */
                arr[i][j] = k;
            }else {                                                   /* 如果该元素不为0,就说明要填的数的位置已经被占,则该数放在上一个数的下面 */                    
                i = i + 2;
                j = j - 1;
                arr[i][j] = k;
            }
        }
        //打印数组    
        for (i = 0; i < 5; i++) {
            for (j = 0; j < 5; j++) {
                System.out.printf("%3d", arr[i][j]);                 // C语言中%3d 表示以3位的固定宽度输出整型数。          //注意:不足3位,在前面补空格; 超过3位,按实际位数输出(但是要在其范围内-32768 ~ 32767)。
            }System.out.println();    
        }
    }
}