s=n(n*n+1)/2,奇数阶魔方可由菱形转变成
n=3,5时如下
3
*********1
******4******2
***7*****5******3
******8******6
*********9
4 9 2
3 5 7
8 1 6
5
*******************1
***************6*******2
**********11*******7*******3
******16*******12*******8*******4
**21******17******13*******9*******5
******22*******18*****14******10
**********23*******19******15
**************24******20
******************25
11 24 7 20 3
4 12 25 8 16
17 5 13 21 9
10 18 1 14 22
23 6 19 2 15
Sample Input
7 0Sample Output
22 47 16 41 10 35 4 5 23 48 17 42 11 29 30 6 24 49 18 36 12 13 31 7 25 43 19 37 38 14 32 1 26 44 20 21 39 8 33 2 27 45 46 15 40 9 34 3 28
题解:和奇数阶魔方右上方类似,这一题是左下方,1位于第n/2+2行,第n/2+1列,然后其右下方为2,依次递增,当该数恰好能被n整除时,下一个数位于该数下面的下面一格,如果超出方格,则重新从第一排开始;如果右下方不在方格内,行回到第一行,列回到第一列,即
if(i%n==0) j=(j+2)%n;
else {j=(j+1)%n; k=(k+1)%n;}
代码(C语言)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int i,j,k,n,a[22][22];
while(scanf("%d",&n) && n){
memset(a,0,sizeof(a));
for(i=1,j=n/2+1,k=n/2;i<=n*n;i++){//j表示行,k表示列;
a[j][k]=i;
if(i%n==0) j=(j+2)%n;
else {j=(j+1)%n; k=(k+1)%n;}
}
for(i=0;i<n;i++){
for(j=0;j<n;j++)
printf("%4d",a[i][j]);
printf("\n");
}
}
return 0;
}