1、将对角线上的数字,换成与它互补的(同色)的数字。这里,n*n+1=4*4+1=17;把1换成17-1=16;把6换成17-6=11;把11换成17-11=6.换成后就是四阶幻方。对于n=4m阶的幻方,我们先把把数字按顺序填写。写好后,按4*4把它划分成m*m各方阵。因为n是4的倍数,一定能用4*4的方阵分割。然后把每个小方阵的对角线,像制作成四阶幻方地方法一样,对角线上的数字换成互补数字,就构成幻方。6461605755545150174746202143422440262737363031333234352928383925412322444519184849525356585962632单
2、偶阶幻方(不能被四整除的是单偶阶幻方)如6阶、10阶、14阶将n阶单偶阶幻方表示为4m+2,将其等分成四分,成为如下图所示A、B、C、D四个2m+1的奇阶幻方。A CD BA用1到(2m+1)2填写成2m+1阶幻方,B用(2m+1)2+1到2*(2m+1)2填写成2m+1阶幻方,C用2*(2m+1)2+1到3*(2m+1)2填写成2m+1阶幻方,D用3*(2m+1)2到4*(2m+1)2填写成2m+1阶幻方。【注:是平方的意思】六阶幻方如下:在A每行取m个小格(中心格及一侧对角线格为必换格,其余m-1格只要不是对角线格即可)也就是说在A中间一行取包裹中心格在内的第m个小格,其它行左侧边缘取m个
3、小格,将其与D中对应得方格交换;B与C任取m-1列进行交换6阶幻方就是4*1+2,那么m就是1在A中间一行取中心格1个小格,将其与D中相应方格进行交换,B与C接近右侧m-1列进行交换(6阶幻方m-1=0故不用交换)。如下图用Strachey法生成的6阶幻方:下面是一个关于上述幻方的编程:数不能太大】#includestdlib.h#define N 120short aNN=0;short n;void jijiehuanfang(short n);void suangoujiehuanfang(short n);void danoujiehuanfang(short n);int main(
4、) short j,i; printf(input one number that you like:); scanf(%d,&n); if(n3) the number is errorn exit(-1); if(n%2=1)/判断是否是奇阶幻方 jijiehuanfang(n); else if(n%4=0)/判断是否为双偶阶幻方 suangoujiehuanfang(n); else/判断是否为单偶阶幻方 danoujiehuanfang(n); for(j=0;jn;j+) for(i=0;ii+) printf(%3d ,aji);n return 1;void jijiehuan
5、fang(short n) short i,j,k; i=(n+1)/2-1; j=0; aji=1; for(k=2;k3|nj3)/把大区域转成小区域 if(ni ni-=4; if(nj nj-=4; if(ni=nj|ni+nj=3)/判断是否在对角线上 aji=n*n+1-k;void danoujiehuanfang(short n) void danoujiehuanfangA(short m); void danoujiehuanfangB(short m); void danoujiehuanfangC(short m); void danoujiehuanfangD(sho
6、rt m); short i,j,m,temp; m=(n-2)/4; danoujiehuanfangA(m); danoujiehuanfangB(m); danoujiehuanfangC(m); danoujiehuanfangD(m);(n+1)/2; if(j!=(2*m+1+1)/2-1) if(i=m&=m+m-1) for(i=0; if(i=3*m+1&=4*m-1)void danoujiehuanfangA(short m) short i,j,k,n;/注意单偶阶幻方A的n不是全局变量的n;方法和奇阶幻方的方法相同 n=2*m+1;=n-1)i=n-1) if(aji
7、=0) if(aji=0) void danoujiehuanfangB(short m)/单偶阶幻方B的方法和奇阶幻方的方法相同 i=3*m+1; aji=2*(2*m+1)*(2*m+1)+1; for(k=2*(2*m+1)*(2*m+1)+2;=3*(2*m+1)*(2*m+1); j=2*m; i=2*m+1; i=2*m+1; i=n-1; j+=2; void danoujiehuanfangC(short m)/单偶阶幻方C的方法和奇阶的方法相同 i=m; j=2*m+1; aji=3*(2*m+1)*(2*m+1)+1; for(k=3*(2*m+1)*(2*m+1)+2;=4*(2*m+1)*(2*m+1); if(j=2*m+1&=2*m)=2*m+1&i=2*m) j-; else if(j=2*m+1& i=0; j=2*m+2; i=2*m; i-; void danoujiehuanfangD(short m)/单偶阶幻方D的方法和奇阶幻方的方法相同 aji=(2*m+1)*(2*m+1)+1; for(k=(2*m+1)*(2*m+1)+2;=2*(2*m+1)*(2*m+1); aji=0; j=2*m+2; i=n-1;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1