输出魔幻正方形(直向、纵向、斜向数自相加均相等)。
一、奇数行的魔幻正方形
第1个数放在第1行第1列的中间,然后向右上填,如果右上已有数字,则向下填,为了计算方便,我
们利用索引1至N,而不是0至N-1,而在计算是向右上或向下时,可以将索引值除以N值,如果得到余
数为1就向下,否则就往右上。
public class MagicSquare{
public static void main(String args[]){
int N = 5;
int i, j, key;
int square[][] = new int[N+1][N+1];
i = 0;
j = (N+1) / 2;
for(key = 1; key <= N*N; key++) {
if((key % N) == 1){
i++;
} else {
i--;
j++;
}
if(i == 0) // 到了最顶,将i变成最尾行
i = N;
if(j > N) // 到了最右,將j变成最左行
j = 1;
square[i][j] = key;
}
for(i = 1; i <= N; i++) {
for(j = 1; j <= N; j++){
System.out.print(square[i][j] + " ");
// jdk1.5有提供System.out.printf的功能,不错哦.以后排版就好看多了.
// System.out.printf("%2d ",square[i][j]);
}
System.out.println();
}
}
}
运行结果:D:\java>
D:\java>
二、行数为4N的魔幻正方形
刚刚说了单数魔幻正方形的方法.
现在说说4N的方法.
一个从左上由1依序开始填,以上至下,左至右,但遇对角线不填。
? 2 3 ?
5 ? ? 8
9 ? ? 12
? 14 15 ?
另一个由左上由16依减速序开始填,上至下,左至右,但只填在对角线。
16 ? ? 13
? 11 10 ?
? 7 6 ?
4 ? ? 1
再将两个合起来就是答案。
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
左上至右下:j % 4 == i % 4
右上至左下:(j % 4 + i % 4) == 1
代碼:
public class MagicSquare{
public static void main(String args[]){
int N=4;
int i, j;
int square[][] = new int[N+1][N+1];
for(j = 1; j <= N; j++) {
for(i = 1; i <= N; i++){
if(j % 4 == i % 4 || (j % 4 + i % 4) == 1)
square[i][j] = (N+1-i) * N -j + 1;
else
square[i][j] = (i - 1) * N + j;
}
}
for(i = 1; i <= N; i++) {
for(j = 1; j <= N; j++)
System.out.print(square[i][j] + " ");
System.out.println();
}
}
}
三、
上面解了单数和4N魔幻正方形。
那只剩下2(2N+1)的未解.
有了这两个方法,
2(2N+1)你自己想想吧.
↑返回目录
前一篇: JDK1.5爱之初体验
后一篇: 辗转相除法求最大公约数