幻方及编程Word格式.docx

上传人:b****6 文档编号:17218628 上传时间:2022-11-29 格式:DOCX 页数:15 大小:17.85KB
下载 相关 举报
幻方及编程Word格式.docx_第1页
第1页 / 共15页
幻方及编程Word格式.docx_第2页
第2页 / 共15页
幻方及编程Word格式.docx_第3页
第3页 / 共15页
幻方及编程Word格式.docx_第4页
第4页 / 共15页
幻方及编程Word格式.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

幻方及编程Word格式.docx

《幻方及编程Word格式.docx》由会员分享,可在线阅读,更多相关《幻方及编程Word格式.docx(15页珍藏版)》请在冰豆网上搜索。

幻方及编程Word格式.docx

将对角线上的数字,换成与它互补的(同色)的数字。

这里,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;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 理化生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1