偶数阶幻方填法
以4阶为例,说说偶数阶的填法:
首先,按顺序写下,,个数:
, , , ,
, , , ,
, ,, ,, ,,
,, ,, ,, ,,
接下来固定对角线上数字不动(这里是,、,、,,、,,和,、,、,,、,,),其它数字作左右对换,如,与,换,,与,换等,得到下面的排列:
, , , ,
, , , ,
,, ,, ,, ,
,, ,, ,, ,,
继续固定对角线,其他数字作上下对称变换,如,与,,换,,与,,换等,得到如下排列:
, ,, ,, ,
,, , , ,
, ,, ,, ,
,, , , ,,
这就是四阶幻方,每行每列四个数字之和均为,,,其他偶
数阶幻方填法可类推~
奇数阶幻方——口诀
1坐边中间,斜着把数填;
出边填对面,遇数往下旋;
出角仅一次,转回下格间。
一、奇数阶纪方的构造
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
(楼梯法)。
把1(或最小的数)放在第一行正中;
按以下规律排列剩下的n*n-1个数:
1)每一个数放在前一个数的右上一格;
2)如果这个数所要放的格已经超出了顶行那么就把它放在底行,仍然要放在右一列;
3)如果这个数所要放的格已经超出了最右列那么就把它放在最左列,仍然要放在上一行;
4)如果这个数所要放的格已经超出了顶行且超出了最右
列那么就把它放在前一个数的下一行同一列的格内;
5)如果这个数所要放的格已经有数填入,处理方法同4)。
图示:
* 1 * * 1 * * * * * * * * * * * * 2
* 1 * * 1 * 3 * * 3 * * * * 2 4 * 2
* 1 * * 1 6 3 5 * 3 5 * 4 * 2 4 * 2
* 1 6 8 1 6 3 5 7 3 5 7 4 * 2 4 * 2
8 1 6
3 5 7
4 9 2
奇数阶幻方的一种用公式表达的构造方法:
设x是要填入的数,(xx,yy)是坐标。坐标如何确定呢, k= (x-1) div n +(n+3) div 2 + (x-1)
yy=k- (k-1) div n *n p= (n+1) div 2 + (x-1)- (x-1) div n
xx=n+1-p+(p-1) div n * n 二、双偶阶(4k)阶幻方的构造方法。
就是说,阶数可以被4整除。
看看4阶幻方的制作方法:
先把数字,按顺序写(从左到右,从上到下): 1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
然后把对角线,换成互补的数字。
定义:
互补:如果两个数字的和,等于幻方最大数和最小数的和,即 n*n+1,称为互补。
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
人们从4阶幻方的制作方法,找到了构造双偶阶幻方的方法:
对于n=4k阶幻方,我们先把数字按顺序填写。写好后,按4*4把它划分成k*k个方阵。把每个小方阵的对角线,象制作4阶幻方的方法一样,换成互补的数字,就构成幻方。
事实上,有些小方阵的对角线是连着的。但是因为没有办法画图,我只能这样子描述。
双偶阶幻方另一种用PASCAL程序语句表达的构造的方法如下:
for i:=1 to n do
for j:=1 to n do
begin
if j mod 4>1 then m:=1
else m:=0;
k:=n-i-(n-2*i+1)*m;
if i mod 4>1 then m:=1
else m:=0;
L:=n-j+1-(n-2*j+1)*m;
a[i, j]:=k*N+L;
end;
三、单偶阶(4k+2)幻方的构造
阶数是偶数,但是,又不能被4整除。这是最难的一种幻方。
一种构造n=4k+2幻方的方法:
(1) 先排出4k的双偶阶幻方
(2) 根据幻方的性质,每个数都同时加上 8k+2 (3) 把它扩展成为4k+2的方阵。这样,四周包围着一圈。我们只要把
1,2,3……,8k+2, (4k+2)^2, (4k+2)^2-1, ……,(4k)^2+1+8k+2 这些数字,填入最外一圈,使得:对角线两端,每行、每列两端数字互补。
当然,最后圈的两横,两列各数之和要等于变幻常数。
以制作6阶幻方为例:
先制作出4阶幻方。
方阵的每个数字,加上8k+2=10
再把它扩大成6阶,如下图:
* * * * * * * 26 12 13 23 * * 15 21 20 18 * * 19 17 16 22 * * 14 24 25 11 * * * * * * *
我们只要把
1,2,3,……,9,10,
36,35,34,……27
填入外圈。
不过,当n较大时,外圈的填法也不太容易。有一种公式来
填外圈。坐标(j,i) 为j行i列的。先固定填下这10个数:
a[1,1]=1 a[n,1]=4 a[n-1,1]=10 a[2,n]=3 a[3,n]=5 a[4,
n]=7
a[n,n-2]=2 a[n,n-1]=9 a[1,2]=6 a[1,3]=8
当n=4k+2时,
a[j,i]=
11,12,…,k+9 (j=1, i=4..k+2) k+10,k+11,…,2k+8 (j=5..k+3, i=n ) 2k+9,2k+10,…,3k+7 (j=n ,i=2k+2..3k) 3k+8,3k+9,…,5k+5 (j=2k+3..4k, i=1) 5k+6,5k+7,…,6k+4 (j=n, i=3k+1..4k-1) 6k+5,6k+6,…,7k+3 (j=k+4…2k+2, i=n)
7k+4,7k+5,…,8k+2 (j=1, i=k+3..2k+1)
按公式算出来后,实际上外圈已经填好了一半了。剩下来的
工作,只要把剩下的相对应元素,填下去。(同行两端的数相
对应、同列两端的数相对应、两条对角线两端的数相对应,
每对之和为n*n+1)。
介绍另外一种构造单偶阶幻方的方法:
<1> 基本图(是个6阶方阵)
4 2 4 2 1 2
1 3 1 3 4 3
4 2 1 2 4 2
1 3 4 3 1 3
4 2 4 2 1 2
1 3 1 3 4 3
这个方阵要把它按2*2把大方阵分割成3*3个格,每个格子里4个数都是1,2,3,4,只是方向上不同。
<2> 如果要作的幻方不是6阶,是更大的阶数: 每次同时在最上面、最下面加入下面方阵:
4 2 4 2 1 2
1 3 1 3 4 3
每加一次,多出4行来,直至想要的阶数。这样加后是个长方形方阵,左边、右边怎么办,
左边都用
4 3
1 2
同时,右边都用
1 2
4 3
填充,每次多出4列来,直至想要的阶数。
下面是加成10*10方阵的例子:
4 3 4 2 4 2 1 2 1 2 1 2 1 3 1 3 4 3 4 3
4 3 4 2 4 2 1 2 1 2 1 2 1 3 1 3 4 3 4 3
4 3 4 2 1 2 4 2 1 2 1 2 1 3 4 3 1 3 4 3
4 3 4 2 4 2 1 2 1 2 1 2 1 3 1 3 4 3 4 3
4 3 4 2 4 2 1 2 1 2 1 2 1 3 1 3 4 3 4 3
如果把每2*2的小格子四个数,看成一个格子,这是一个2k+1奇数阶方阵。
画个(2k+1)*(2k+1)的格子吧,格子画大一点,我们要按奇数阶幻方的填法,填写这些格子,只不过每次要填写的是四个
数。方向跟着制作出来的参考图方向一样。
例:我们要做一个6阶的幻方。参考图当然是用<1> 基本图,
不需要迭加了。然后,列成3*3个大格子,大格子的顺序我
们按奇数幻方的顺序填写,小格子里的顺序按1,2,3,4这四个
数字的方向填写,按顺序每次填入4个数:
* * 4 2 * * * * 4 2 * * * * 1 3 * * * * 1 3 * *
* * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * 5 6 * * * * * * * * * * 8 7
=============================================
* * 4 2 * * * * 4 2 * * * * 1 3 * * * * 1 3 * *
12 10 * * * * 12 10 * * * * 9 11 * * * * 9 11 * * * *
* * * * 5 6 16 14 * * 5 6 * * * * 8 7 13 15 * * 8 7
=============================================
…………
继续直至填完。
三、练习
1、用1、4、7、10、13、16、19、22、25填出三阶幻方。
2、用95、85、75、65、55、45、35、25、15填出三阶幻方。
3、用1—81八十一个自然数填出一个九阶幻方。
4、用1/2、1/3、2/3、1/4、3/4、1/6、1/12、5/12、7/12九个
分数摆一个三阶幻方。
奇数阶幻方程序
/**
* n阶幻方程序
* 完成者:meteor135
* 完成日期:2003.9.8
* 编译环境:VC6.0
*/
#include
#include
#include
void showFangzhen(int n);
int main()
{
//输出10组幻方
for(int n = 0; n < 10; n ++)
showFangzhen(2*n+1);
cout<<"Press enter to quit!";
cin.get();
return 0;
}
void showFangzhen(int n) {
if(!(n%2)) return;
int i,j,**array;
//为指针分配动态内存
array=new int*[n];
for(i=0; i #include
#include #define N 3
#define M 226
void main()
{textmode(C40);
clrscr();
int x,y,p,q,n,num=1;
int a[M][M];
int flag=0;
int k,s;
for(k=0;k<=M-1;k++)
for(s=0;s<=M-1;s++)
a[k][s]=0;
printf("n=?");
while(flag==0)
{
scanf("%d",&n);
if(n>=1&&n<=M-1&&n%2!=0)
flag=1;
// printf("input error!");
}
if(n>7)
// textmode(C80);
clrscr();
gotoxy((n/2+1)*N,N);
printf("%d",num);
x=n/2+1;
y=1;
a[x][y]=num;
num++;
while(num<=n*n)
{
if(p=x,x-1<1)
x=n;
else
x--;
if(q=y,y-1<1)
y=n;
else
y--;
if(a[x][y]==0)
a[x][y]=num;
else
{
a[p][q+1]=num;
x=p;
y=q+1;
}
gotoxy(x*N,y*N);
printf("%d",num);
num++;
delay(300);
}
char ch;
ch=getchar();
ch=getchar();
}
任一阶幻方
#include #include void swap(int *a,int *b) {
int t;
t=*a;
*a=*b;
*b=t;
}
void hf1(int n,int *p) {
int m=1,i,j,k,l;
for(i=0;in*n)
break;
k=i-1;
l=j+1;
if(k==-1)
k=n-1;
if(l==n)
l=0;
if(*(p+k*n+l)!=0){
i++;
continue;
}
i=k;
j=l;
}
}
void hf2(int n,int *p) {
int i,j,*q;
q=malloc(n*n/2);
hf1(n/2,q);
for(i=0;i=n-(n-4)/4;j--)
swap(p+i*n+j,p+(i+n/2)*n+j);
}
swap(p+(n/2-1)/2*n,p+(3*n/2-1)/2*n);
swap(p+(n/2-1)/2*n+(n/2-1)/2,p+(3*n/2-1)/2*n+(n/2-1)/2);
}
void hf3(int n,int *p)
{
int i,j,k,m=1;
for(i=0;i=n/2;i++,j--){
if(i==n)
i=0;
swap(p+i*n+j,p+(n-1-i)*n+n-1-j);
}
}
}
void main()
{
int i,j,n,*p;
printf("Enter n:");
scanf("%d",&n);
p=malloc(2*n*n);
if(n%2!=0)
hf1(n,p);
else if(n%4!=0) hf2(n,p);
else
hf3(n,p);
for(i=0;i
本文档为【偶数阶幻方填法.doc】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。