魔方问题 http://www.programfan.com/club/showbbs.asp?id=95170 魔方:每行每列每条对角线之和均相等. 例如:816 357 492 加起来都是15 现在要求打印出1到n平方的自然数构成的魔方阵. 816 357 492 1=A(1,2) 2=A(3,3) 3=A(2,1) 4=A(3,1) 5=A(2,2) 6=A(1,3) 7=A(2,3) 8=A(1,1) 9=A(3,2) 发现规律了吗? 要分三种情形考虑 1.n为奇数 2.n为4的倍数 3.n可写为形如2(n+1)的形式 具体规则可以去找本小学或中学的数学奥赛书看看 http://web.163.sh.cn/~linsoso/d.png ------------------------------------ http://programfan.com/club/showbbs.asp?id=97978 由chdbj发布 魔方阵算法: (1)将1放在第一行中间一列 (2)从2开始直到n*n止个数一次按下列规则存放,每一个数存放的行比前一个数的行数减1,列数加1 (3)如果上一数的行数为1,,则下一个数的行数为n (4)当上一个数的列数为n时,下一个数的列数应为1,行数减1 (5)如果按上面的规则确定的位置上已有数,或上一个数是第一行的n列时,则把下一个数放在上一个数的下面 #include <stdio.h> int main() { int a[16][16],i,j,k,p,m,n; p=1; while(p==1){ printf("输入 n(n=1~15)"); scanf("%d",&n); if((n!=0)&&(n<=15)&&(n%2!=0)) p=0; } /*初始化*/ for(i=1;i<=n;i++) for(j=1;j<=n;j++) a[i][j]=0; /*建立魔方阵*/ j=n/2+1; a[1][j]=1; for(k=2;k<=n*n;k++){ i=i-1; j=j+1; if((i<1)&&(j>n)){ i=i+2; j=j-1; } else{ if(i<1) i=n; if(j>n) j=1; } if(a[i][j]==0) a[i][j]=k; else{ i=i+2; j=j-1; a[i][j]=k; } } for(i=1;i<=n;i++){ for(j=1;j<=n;j++) printf("%4d",a[i][j]); printf("\n"); } return 0; }

评论