所谓魔方阵,指的是1~n*n共n*n个自然数,排列成nXn的方阵,使得该方阵的每行、每列、对角线元素之和相等,并为只与n有关的常数,该常数为(1/2)nX(nXn+1)。
假定阵列的行列下标都从1开始,则魔方阵的生成方法如下:
1.在第1行中间置1;
2.假定当前元素的下标为(i,j),则对其余的2~n*n个数,基本的放置位置为当前位置的右上方,即下标为(i-1,j+1)。与此同时,若当前的数是n的倍数,则放在当前位置的正下方,即下标为(i+1,j);若i-1小于1,则将这个数放在本列的最下端;若j+1大于n,则将这个数放在本行的最左端。
#include "stdafx.h"
#include <malloc.h>
#include <stdlib.h>
void Array(int n);
void main()
{
int n;
printf("Set n,please:\n");
scanf("%d",&n);
Array(n);
system("PAUSE");
}
void Array(int n)
{
int i, j, no, num, max;
int*mtrx;
if (n %2==0)
{
n = n +1;
}
max = n * n;
/*C数组时基于0的*/
mtrx = (int*)malloc(max);
mtrx[n /2] =1;
i =0;
j = n /2;
for (num =2; num <= max; num ++)
{
i = i -1;
j = j +1;
if ((num -1) % n ==0)
{
i = i +2;
j = j -1;
}
if (i <0)
{
i = n -1;
}
if(j > n -1)
{
j =0;
}
no = i * n + j;
mtrx[no] = num;
}
/*显示魔阵的元素*/
printf("The charming matrix is :");
no =0;
for (i =0; i < n; i ++)
{
printf("\n");
for(j =0; j < n; j ++)
{
printf("%3d",mtrx[no]);
no ++;
}
}
}
#include <malloc.h>
#include <stdlib.h>
void Array(int n);
void main()
{
int n;
printf("Set n,please:\n");
scanf("%d",&n);
Array(n);
system("PAUSE");
}
void Array(int n)
{
int i, j, no, num, max;
int*mtrx;
if (n %2==0)
{
n = n +1;
}
max = n * n;
/*C数组时基于0的*/
mtrx = (int*)malloc(max);
mtrx[n /2] =1;
i =0;
j = n /2;
for (num =2; num <= max; num ++)
{
i = i -1;
j = j +1;
if ((num -1) % n ==0)
{
i = i +2;
j = j -1;
}
if (i <0)
{
i = n -1;
}
if(j > n -1)
{
j =0;
}
no = i * n + j;
mtrx[no] = num;
}
/*显示魔阵的元素*/
printf("The charming matrix is :");
no =0;
for (i =0; i < n; i ++)
{
printf("\n");
for(j =0; j < n; j ++)
{
printf("%3d",mtrx[no]);
no ++;
}
}
}
输出结果: