Lab-1 3.1.2generateMagicSquare() 偶数异常

在这段生成幻方的代码中,要是矩阵的宽度,即n,输入为偶数时会出现报错。
public static boolean generateMagicSquare(int n) {
int magic[][] = new int[n][n];
int row = 0, col = n / 2, i, j, square = n * n;
for (i = 1; i <= square; i++) {
magic[row][col] = i;
if (i % n == 0)
row++;
else {
if (row == 0)
row = n - 1;
else
row--;
if (col == (n - 1))
col = 0;
else
col++;
}
}
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++)
System.out.print(magic[i][j] + "\t");
System.out.println();
}
return true;
}
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException : 12
at MagicSquare.generateMagicSquare( MagicSquare.java:17 )
at MagicSquare.main( MagicSquare.java:121 )
这是为什么呢?
首先,我们先了解这段报错是什么意思。

java.lang.ArrayIndexOutOfBoundsException 是一个运行时异常,表示尝试访问数组的索引超出了数组界限(即索引小于0或者大于等于数组的大小)。

下面是这段代码能实现生成幻方的流程图

        参数n作为幻方的行列数,初始位置为(0, n / 2), 初始位置赋值1,之后依次把数字2 ~ n * n赋值给一个位置,下一个位置为当前位置的右上。根据所在位置的坐标和n的值计算出下一个位置。边界情况:当前行是第一行,则下一行取最后一行;当前列是最右边列,则下一列取最左边列。当i能被n整除时,则将当前位置正下方的第一个位置赋值为i + 1,然后继续循环赋值。

        这样得出的矩阵,满足幻方的要求。

        由于在奇数的宽度的矩阵,正中间的位置,能将左右对称的划分开来,这样我们使用这个生成幻方的方法时,才能够对称的将数字都填进去。而当宽度是偶数时,(0,n/2)这个位置不处于正中,就会导致填数时位置偏移,将数填到索引界限之外。

debug实例测试结果

以偶数6为例子,会出现在i == 18的时候出现报错。因为此时18位于最左列和最下行,由于条件以偶数6为例子,会出现在i == 18的时候出现报错。因为此时18位于最左列和最下行,由于条件

if (i % n == 0)
row++;

在前,决定了会将row++,此时row的大小变成了6,而数组到达了边界,并没有开辟空间magic[6][0],就导致了出现“组的索引超出了数组界限”的报错。因为偶数宽度,会导致初始位置不在数组第一行的正中间,那么在判断条件的时候会比奇数更复杂。

个人理解,有误请指出,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值