C语言求所有四阶幻方
发布时间:2025-05-13 18:23:14 发布人:远客网络
一、C语言求所有四阶幻方
#define EVEN_DOUBLE_4 4//双偶的最基本类型,4阶双偶
#define SCREEN_SIZE 19//屏幕显示不变形的最大尺寸(主要是因为窗口大小限制)
#define MIN_SIZE 3//最小阶数为3
/*原则上是任意阶,算法是相同的,这里就以30为上限吧,
当然如果你愿意,可以修改的更大一些*/
#define PRINT printf("Esc退出,Enter继续");//打印的宏
#define CLEAR row= 0; column= 0;//清零
int Magic[MAX_SIZE][MAX_SIZE]={0};//全局,幻方数组
int row= 0; column= 0;//全局,幻方的行列数
void odd(int size, int ini_value);//奇数阶幻方生成
void mean_double_4(int size);//4阶双偶生成
void mean_double(int size);//双偶生成
void mean_single(int size);//单偶生成
void print_magic(int size);//打印幻方
void sum_print(int data[], int size);//行、列、对之和打印
void check_magic(int data[], int size);//检查所得矩阵是否为幻方阵
int sum[2*MAX_SIZE+2]={0};//行、列、对之和
else if(size%4== 0) mean_double(size);
printf("请输入幻方阶数n,n∈[%d,%d]\n", min_size, max_size);
if(size<3|| size> MAX_SIZE) printf("非法输入,请重新输入[%d,%d]的正整数\n", min_size, max_size);
else if(size> SCREEN_SIZE){
printf("大于屏显最大阶数,输出将变形\n");
}while(size< MIN_SIZE|| size> MAX_SIZE);
void odd(int size, int ini_value)
int max_num= 1+size*size+ini_value;//填充范围
for(num= min_num; num< max_num; num++){
else x++, y+= 2;//马步,其实Horse法和Siamese是完全类似的
/*越界反弹,即触碰到边界,从另一边返回*/
/*对调法的基础,4阶双偶。注意要求是将非主副对角线上的元素对调,
其实换个角度,你也可以说就是把祝福对角线中心对调。只不过两种思路得到的矩阵
for(i= 0; i< EVEN_DOUBLE_4; i++){
Magic[row+i][column+i]= total- Magic[row+i][column+i];
Magic[row+i][ EVEN_DOUBLE_4+column-i-1]=
total- Magic[row+i][ EVEN_DOUBLE_4+column-i-1];
int max_num= 1+size*size;//填充范围
for(num= min_num; num< max_num; num++){
for(i= 1; i<=temp*temp; i++){
if(i% temp== 0) column= 0, row+= 4;
else column=(i% temp)* EVEN_DOUBLE_4;
与普通直角坐标系象限区别,说白了,就是个分块的概念
row= size/2, column= size/2;//第二象限
row= 0, column= size/2;//第三象限
row= size/2, column= 0;//第四象限
Magic[i][k]= Magic[i+ 2*size/4 ][k];
Magic[i][k]= Magic[i+ 2*size/4][k];
if(j== size-1) putchar('\n');
/*打印各行、各列、各对角线数据之和*/
void sum_print(int data[], int size)
data[i]+= Magic[i][j];//行之和
if(j== size-1) printf("%6d", data[i]);
data[size+i]+= Magic[j][i];//列之和
if(j== size-1) printf("%6d", data[size+i]);
printf("主对角线之和:%6d", data[2*size]);
data[2*size+1]+= Magic[i][size-i-1];
printf("主对角线之和:%6d", data[2*size]);
for(i= 0; i< 2* MAX_SIZE; i++)
/*检查程序是否运转正常,所得结果是否是幻方*/
void check_magic(int data[], int size)
if(flag) printf("程序出错,Esc退出,Enter继续\n");
else printf("\n恭喜你,获得了一个新的%d阶幻方!\n", size);
二、怎样用C语言编写幻方
你的这个问题实际上包括两个问题:
关于幻方的算法,或者叫幻方填法,目前有很多种,拉丁正交、马步法等等,针对奇数或者偶数(又分单偶数和双偶数)等有不同的算法,但这些算法只是帮你找到幻方的一个或多个实例(不会是全部),而同阶数的幻方到底有多少个,那只有用穷举法了,比如4阶幻方,基本4阶幻方共7040个,剔除旋转翻转的,即具有独立结构的共880个;4阶完美幻方共84个,具有独立结构的共48个。
对于高阶幻方(比如超过8阶),穷举法实际上是不可行的,因为它的穷举时间将是天文数字(以目前主流PC),所以不要试图用计算机穷举高阶幻方的全部结果,那将是徒劳的。
如果你只是需要1个实例,那么推荐你使用MATLAB语言工具,因为它提供了幻方函数magic(n),不需要编程,直接从命令窗口输入就可以得到答案。
至于第二个问题,当然你首先会C语言,剩下的就是编程技巧问题了,而这个问题是无从回答的。相信你问的是第一个问题。
以上的回答虽然没有明确给出答案,但相信对你会有帮助。
三、六阶幻方怎么解
1、下面是六阶幻方的其中一个答案:
2、=================================================
3、注意:这个幻方的每行每列对角线的六个数之和为111(幻和为111),还有一个特点就是中间的十六个数也构成一个四阶幻方哦,幻和为74。希望满意答案。
4、=====================================================================
5、下面介绍一下奇数幻方,双偶,单偶幻方的常见规律。
6、(2)从2开始直到n×n止各数依次按下列规则存放:
7、每一个数存放的行比前一个数的行数减1,列数加1
8、(3)如果行列范围超出矩阵范围,则回绕。
9、例如1在第1行,则2应放在最下一行,列数同样加1;
10、(4)如果按上面规则确定的位置上已有数,或上一个数是第1行第n列时,
11、则把下一个数放在上一个数的下面。
12、首先把数1到n×n按从上至下,从左到右顺序填入矩阵
13、然后将方阵的所有4×4子方阵中的两对角线上位置的数关于方阵中心作对
14、称交换,即a(i,j)与a(n-1-i,n-1-j)交换,所有其它位置上的数不变。
15、(或者将对角线不变,其它位置对称交换也可)
16、当n为非4倍数的偶数(即4n+2形)时:首先把大方阵分解为4个奇数(2m+1阶)子方阵。
17、按上述奇数阶幻方给分解的4个子方阵对应赋值
18、上左子阵最小(i),下右子阵次小(i+v),下左子阵最大(i+3v),上右子阵次大(i+2v)
19、即4个子方阵对应元素相差v,其中v=n*n/4
20、四个子矩阵由小到大排列方式为①③
21、然后作相应的元素交换:a(i,j)与a(i+u,j)在同一列做对应交换(j<t或j>n-t+2),
22、a(t-1,0)与a(t+u-1,0);a(t-1,t-1)与a(t+u-1,t-1)两对元素交换
23、其中u=n/2,t=(n+2)/4上述交换使每行每列与两对角线上元素之和相等。
24、=================================================================
25、下面给出C语言编程实现任意幻方的解答:
26、p=a[j];a[j]=a[i+k][j];a[i+k][j]=p;
27、p=a[j];a[j]=a[i+k][j];a[i+k][j]=p;
28、if((i>=t&&i<=k-t-1)&&(j>=t&&j<t*2))
29、p=a[j];a[j]=a[i+k][j];a[i+k][j]=p;
30、p=a[j+k];a[j+k]=a[i+k][j+k];a[i+k][j+k]=p;
31、a[i+k][j+k]=n*n-a[i+k][j+k]+1;
32、a[i-k][j+k]=n*n-a[i-k][j+k]+1;
33、int check(int n)//检验是否是幻方
34、for(sum1=0,sum2=0,i=0,j=0;i<n;i++,j++)
35、void ins(int n)//单偶数幻方的输入
36、=====================================
37、说明:以上C语言程序,复制到TXT文本,然后,另存为XXX.c文件,利用编程软件,编译这个文件,再保持到电脑,以后想用,直接点击就会运行。运行后,可以随意输入一个幻方阶数,就会自动生成一个幻方组合出来。
38、再说明一点:以上C程序仅供参考,我刚才编译过,因为是中文输入法输入的,所以不通过,需要把上边的标点符号切换到英文输入法,再输入才可以通过编译。
39、以下程序是可以通过编译,只是奇数幻方的C程序,还有,我命令它阶数范围是1~15阶的奇数幻方。
40、==================================
41、==================================
42、第一:奇数幻方利用“楼梯法”和“杨辉法”很简单就能制作出来,可能上面描述的单偶,双偶幻方不是很详细,你可以上网查找一下相关资料,都会有图文解说的,很直观,规律看起来也很简单。
43、第二:关于编程可以解出幻方,可以进行了解,但是可不能一直只利用它哦,得自己琢磨推算幻方,例如利用推理法也可以把所有的幻方推算出来,这样才能更好地学习(我不用上面的规律也可以把任何一个幻方都推算出来,当然,高次幻方就相对比较难了)。