/* 奇数届魔方阵 */
/* 从1开始依次放入,第一个数放在第一行的最中间一列,
此后的每一个数放在前一个数的上一行的下一列,如果此
位置已经有数,则将它放在前一个数的下面。 */
/* 奇数届魔方阵 */
/* 从1开始依次放入,第一个数放在第一行的最中间一列,
此后的每一个数放在前一个数的上一行的下一列,如果此
位置已经有数,则将它放在前一个数的下面。 */
#include "stdio.h"
#include "conio.h"
#define N 59 /* 最大届数 */
int main()
{
int a[N+1][N+1] = {0};
int s,h,l,n;
int s1 = 0, s2 = 0;
FILE *fp;
do /*输入合理的届数*/
{
printf("\nPlease input an odd number : ");
scanf("%d",&n);
}
while(n < 3 || n > N || n % 2 == 0); /* 3到N之间的奇数合理 */
/* 将数据放入数组 */
s = 1;
h = 1;
l = (n + 1) / 2;
a[h][l] = 1;
for(s = 2; s <= n * n; s++)
{ h --;
l ++;
if(h < 1 && l > n)
{
h = 2;
l = n;
}
if(h < 1) h = n;
if(l > n) l = 1;
if(a[h][l] !=0 )
{
h = h + 2;
l = l - 1;
}
a[h][l] = s;
}
/* 求每一行的和、两条对角线的和 */
for(h = 1; h <= n; h++)
{
for(l=1; l <= n; l++)
a[h][0] += a[h][l];
s1 += a[h][h]; /* 正对角线 */
s2 += a[h][n - h + 1]; /* 反对角线 */
}
/* 求每一列的和 */
for(l=1; l <= n; l++)
for(h = 1; h <= n; h++)
a[0][l] += a[h][l];
/* 创建文件 c:\MagicArray.txt */
if( (fp = fopen("d:\\MagicArray.txt","a")) == NULL)
{
printf("\nCan not open MagicArray.txt . !");
getch();
return 0;
}
/* 显示魔方阵,并输出到文本文件 */
printf("\nThe sum of the %d * %d magic array is %d (%d) . \n\n",n,n,s1,s2);
fprintf(fp,"\nThe sum of the %d * %d magic array is %d (%d) . \n\n",n,n,s1,s2);
for(h = 0; h <= n; h++)
{
for(l=0; l <= n; l++)
{
if(h == 0 && l == 0) /* 左上角无数据,屏幕或文件中要空出位置 */
{
printf("%6s"," ");
fprintf(fp,"%6s"," ");
}
else
{
//textcolor((h + l) % 16);
printf("%6d",a[h][l]);
fprintf(fp,"%6d",a[h][l]);
}
}
printf("\n\n");
fprintf(fp,"%s","\n\n");
}
fclose(fp);
}