幻方及编程Word格式.docx
- 文档编号:17218628
- 上传时间:2022-11-29
- 格式:DOCX
- 页数:15
- 大小:17.85KB
幻方及编程Word格式.docx
《幻方及编程Word格式.docx》由会员分享,可在线阅读,更多相关《幻方及编程Word格式.docx(15页珍藏版)》请在冰豆网上搜索。
将对角线上的数字,换成与它互补的(同色)的数字。
这里,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的方阵分割。
然后把每个小方阵的对角线,像制作成四阶幻方地方法一样,对角线上的数字换成互补数字,就构成幻方。
64
61
60
57
55
54
51
50
17
47
46
20
21
43
42
24
40
26
27
37
36
30
31
33
32
34
35
29
28
38
39
25
41
23
22
44
45
19
18
48
49
52
53
56
58
59
62
63
2单偶阶幻方(不能被四整除的是单偶阶幻方)如6阶、10阶、14阶…将n阶单偶阶幻方表示为4m+2,将其等分成四分,成为如下图所示A、B、C、D四个2m+1的奇阶幻方。
AC
DB
A用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个小格,
将其与D中对应得方格交换;
B与C任取m-1列进行交换6阶幻方就是4*1+2,那么m就是1在A中间一行取中心格1个小格,将其与D中相应方格进行交换,B与C接近右侧m-1列进行交换(6阶幻方m-1=0故不用交换)。
如下图用Strachey法生成的6阶幻方:
下面是一个关于上述幻方的编程:
数不能太大】
#include<
stdio.h>
stdlib.h>
#defineN120
shorta[N][N]={0};
shortn;
voidjijiehuanfang(shortn);
voidsuangoujiehuanfang(shortn);
voiddanoujiehuanfang(shortn);
intmain()
{
shortj,i;
printf("
inputonenumberthatyoulike:
"
);
scanf("
%d"
&
n);
if(n<
3)
{
thenumberiserror\n"
exit(-1);
}
if(n%2==1)//判断是否是奇阶幻方
jijiehuanfang(n);
else
if(n%4==0)//判断是否为双偶阶幻方
suangoujiehuanfang(n);
else//判断是否为单偶阶幻方
danoujiehuanfang(n);
for(j=0;
j<
n;
j++)
for(i=0;
i<
i++)
printf("
%3d"
a[j][i]);
\n"
return1;
}
voidjijiehuanfang(shortn)
shorti,j,k;
i=(n+1)/2-1;
j=0;
a[j][i]=1;
for(k=2;
k<
=n*n;
k++)
if(j==0&
&
i!
=n-1)//判断是否在最上行不在最右行
j=n-1;
i++;
a[j][i]=k;
elseif(j!
=0&
i==n-1)//判断是否在最右行不在最上行
j--;
i=0;
elseif(j==0&
i==n-1)//判断是否在最上行最右行
if(a[j][i]==0)//判断最左下角是否已有数字
a[j][i]=k;
i=n-1;
j=1;
//把值赋给它下面的数组
i++;
if(a[j][i]==0)//判断他左上角是否已有数字
a[j][i]=k;
else
{
j+=2;
i--;
}
voidsuangoujiehuanfang(shortn)
shorti,j,k,ni,nj;
for(j=0,k=1;
j++)//将数组赋值(1~n*n)
k++;
ni=i;
nj=j;
while(ni>
3||nj>
3)//把大区域转成小区域
if(ni>
ni-=4;
if(nj>
nj-=4;
if(ni==nj||ni+nj==3)//判断是否在对角线上
a[j][i]=n*n+1-k;
voiddanoujiehuanfang(shortn)
voiddanoujiehuanfangA(shortm);
voiddanoujiehuanfangB(shortm);
voiddanoujiehuanfangC(shortm);
voiddanoujiehuanfangD(shortm);
shorti,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)
{
temp=a[j][i];
a[j][i]=a[j+2*m+1][i];
a[j+2*m+1][i]=temp;
}
else;
if(i>
=m&
=m+m-1)
for(i=0;
if(i>
=3*m+1&
=4*m-1)
voiddanoujiehuanfangA(shortm)
shorti,j,k,n;
//注意单偶阶幻方A的n不是全局变量的n;
方法和奇阶幻方的方法相同
n=2*m+1;
=n-1)
i==n-1)
if(a[j][i]==0)
if(a[j][i]==0)
}
voiddanoujiehuanfangB(shortm)//单偶阶幻方B的方法和奇阶幻方的方法相同
i=3*m+1;
a[j][i]=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;
voiddanoujiehuanfangC(shortm)//单偶阶幻方C的方法和奇阶的方法相同
i=m;
j=2*m+1;
a[j][i]=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--;
elseif(j==2*m+1&
i=0;
j=2*m+2;
i=2*m;
i--;
voiddanoujiehuanfangD(shortm)//单偶阶幻方D的方法和奇阶幻方的方法相同
a[j][i]=(2*m+1)*(2*m+1)+1;
for(k=(2*m+1)*(2*m+1)+2;
=2*(2*m+1)*(2*m+1);
a[j][i]=0;
j=2*m+2;
i=n-1;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编程
![提示](https://static.bdocx.com/images/bang_tan.gif)