输出魔方阵

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

4.输出"魔方阵".

所谓魔方阵,是指这样的方阵,它的每一行、每一列和对角线之和均相等。

要求:从键盘输入一个n(n>2),输出由1~n2的自然数构成的魔方阵;

如n=3时的魔方阵为:

8 1 6

3 5 7

4 9 2

.

for(i=0;i

for(i=0;i

if(j%4==i%4||(j%4+i%4)==3) .换成其补数

for(i=0;i

小方阵按奇数阶算法依次填入

A(1…[2k+1]2)、B([2k+1]2+1…2[2k+1]2)、C(…)、D(…4[2k+1]2);

A与D换:A中间格始向右取k格;A最左边的k列(除中行);

C与B互换:从C的中间列开始向左数k-1列。

.

for(i=0;i

for(j=0;j

for(i=0;i

if(j%4==i%4||(j%4+i%4)==3) .换成其补数

}

void MagicSev(int a[M][M],int st,int n) .

t=a[k][j];

a[k][j]=a[k+m][j]; 与D对应位置交换

a[k+m][j]=t;

}

for(i=0;i

if(i!=k) 除中间行外

for(j=0;j

t=a[i][j];

a[i][j]=a[i+m][j]; 与D应位置交换

a[i+m][j]=t;

}

}

for(i=0;i

a[i+m][j]=t;

}

}

void OutMagic(int a[M][M],int n) //输出n阶魔方阵!

{

int i,j;

for(i=0;i

printf("\n");

for(j=0;j

}

}

void SumMagic(int a[M][M],int n) //求魔方阵各行/列的和

{

int i,j;

for(i=0;i

for(j=0;j

for(i=0;i

for(j=0;j

for(i=0;i

}

void main()

{

int n;

int a[M][M]={0};

printf("魔方阵的阶数n="); //n为大于2的任意整数

scanf("%d",&n);

switch(n%4){

case 1:

case 3:MagicOdd(a,0,0,1,n);break; //奇数阶魔方阵

case 0:MagicDev(a,1,n);break; //双偶(4k)阶魔方阵

case 2:MagicSev(a,1,n);break; //单偶(4k+2)阶魔方阵}

SumMagic(a,n); //计算各行/列的和

OutMagic(a,n); //输出魔方阵

printf("\n\n校验:\n");

OutMagic(a,n+1); //输出魔方阵及各行/列的和进行验证

}

相关文档
最新文档