输出魔方阵
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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); //输出魔方阵及各行/列的和进行验证 }