要求说明:打印五阶幻方即他的每一行、每一列和对角线之和相等。
解:(1)将1(第一个数)放在第一行中间一列
(2)从2(第二个数开始)直到25(第二十五个数)各数依次按下列规则存放:每个数存放的行比前一个数的行数减1,列数加1.
(3)如果上一行的数的行数为1,则下一个数的行数为5,列数加1.
(4)当上一个数的列数为5时,下一个数的列数应为1,行数减1.
(5)如果按照上面步骤确定的位置上已经有数(本题中不为0),或者上一个数是第1行第5列时,则把下一个数放在上一个数的下面
注:下标从1~5
//打印五阶幻方
#include <stdio.h>
int main()
{
int i,j,x = 1, y = 3,a[6][6] = {0};
for(i = 1; i <= 25; i ++)
{
a[x][y] = i; //1~25数字存放到相应位置
if( x == 1 && y == 5) //将第一行第五列数字下一位填入他的下面
{
x = x + 1;
continue;
}
if( x == 1) //行数为1时减1,下一个行数为5
x = 5;
else //否则,行数减1
x--;
if( y == 5) //列数为5时加1,下一个列数为1
y = 1;
else //否则列数加1
{
y++;
}
if(a[x][y] != 0) //如果该位置已存在数字,则填入上一个数的下面
{
x = x+2;
y = y-1;
}
}
for(i = 1; i <= 5; i++) //遍历输出
{
for(j = 1; j<= 5;j++)
{
printf("%4d ",a[i][j]); //此时4用于输出的宽度间隔,使数据相对整齐
}
printf("\n"); //换行
}
}
样例输入输出:
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9