奇数阶魔方阵的数字规律
通过对奇数阶魔方阵的分析,其中的数字排列有如下的规律:
(1)自然数1出现在第一行的正中间;
(2)若填入的数字在第一行(不在第n列),则下一个数字在第n行(最后一行)且列数加1(列数右移一列);
(3)若填入的数字在该行的最右侧,则下一个数字就填在上一行的最左侧;
(4)一般地,下一个数字在前一个数字的右上方(行数少1,列数加1);
(5)若应填的地方已经有数字或在方阵之外,则下一个数字就填在前一个数字的下方。(一般地,n的倍数的下一个数字是在该数的下方。)
C语言版本实现3阶魔方阵如下:
#include <stdio.h> int main(){ int row=3; int nums[3][3]; int rowindex=0,colindex=0; //自然数1出现在第一行的正中间 nums[0][row/2]=1; rowindex=0; colindex=row/2; int i,j; for(i=2;i<=row*row;i++){ //若填入的数字在第一行且不在最后n列,则下一个数字在第n行且列数加1 if(rowindex==0&&colindex!=row-1){ rowindex=row-1; colindex=colindex+1; nums[rowindex][colindex]=i; continue; } //若填入的数字在改行最右侧且不在第一行,则下一个数字就在上一行的最左侧 if(colindex==row-1&&rowindex!=0){ rowindex=rowindex-1; colindex=0; nums[rowindex][colindex]=i; continue; } //若应填入的地方已经有数字或者在方阵之处,则下一个数字就填在前一个数字的 //一个数字的下方 if(rowindex==0||colindex==rowindex-1||nums[rowindex-1][colindex+1]!=0){ rowindex=rowindex+1; nums[rowindex][colindex]=i; }else { //一般地,下一个数字在前一个数字的右上方(行数减1,列数加1) rowindex-=1; colindex+=1; nums[rowindex][colindex]=i; } } //输出 int count=0; for(i=0;i<row;i++){ for(j=0;j<row;j++){ count++; printf("%d\t", nums[i][j]); if(count%3==0){ printf("\n"); } } } return 0; }
运行结果如下:
8 1 6 3 5 7 4 9 2