10幻方c语言,幻方算法 C语言描述

本文介绍了C语言实现幻方算法的详细过程,包括奇数阶幻方的劳伯法、双偶数阶幻方的海尔法和单偶数阶幻方的斯特拉兹法。通过动态内存分配创建数组,并提供了相应的C语言代码示例。
摘要由CSDN通过智能技术生成

幻方算法的所有情况描述及C语言表示 2019-03-30

讨论幻方前,先讨论一下动态申请数组大小

众所周知 在C语言中必须指定数组的大小 否则会报错。如果你不知道你要申请多大的数组怎么办?初始化一个非常大的数组?显然浪费空间。。

头文件#include 为我们提供了malloc函数 即动态内存分配函数 我们可以用它来为我们分配我们想要的数组大小

你想分配一个自己键盘输入大小的数组 就用malloc函数来实现(以下代码都用伪代码表示)

本题的申请数组就将用到这个方法

1.int *arr;//声明一个指针变量

scanf("%d",&n);

a=(int *)malloc(sizeof(int)*n);//这样就新建了一个长度为n的一维数组

2.int **arr;//声明一个二级指针 即指向指针的指针

scanf("%d",&n);

arr = (int **)malloc(sizeof(int*)*n);//申请一个n*n的二维数组

for (i = 0;i < n;i++)

arr[i] = (int *)malloc(sizeof(int)*n);

一、幻方按照阶数可分成了三类,即奇数阶幻方、双偶阶幻方(n%4==0)、单偶阶幻方(n-2%4==0)

奇数阶幻方(劳伯法)

奇数阶幻方最经典的填法是罗伯法。填写的方法是:

把1(或最小的数)放在第一行正中;按以下规律排列剩下的(n×n-1)个数:

(1)每一个数放在前一个数的右上一格;

(2)如果这个数所要放的格已经超出了顶行那么就把它放在底行,仍然要放在右一列;

(3)如果这个数所要放的格已经超出了最右列那么就把它放在最左列,仍然要放在上一行;

(4)如果这个数所要放的格已经超出了顶行且超出了最右列,那么就把它放在底行且最左列;

(5)如果这个数所要放的格已经有数填入,那么就把它放在前一个数的下一行同一列的格内。

例,用该填法获得的5阶幻方:

2f11f98901802b8acd53f9c57f1ef39b.png

二、双偶数阶幻方(海尔法)

所谓双偶阶幻方就是当n可以被4整除时的偶阶幻方,即4K阶幻方。在说解法之前我们先说明一个“互补数”定义:就是在n阶幻方中,如果两个数的和等于幻方中最大的数与1的和(即n×n+1),我们称它们为一对互补数。如在三阶幻方中,每一对和为10的数,是一对互补数 ;在四阶幻方中,每一对和为17的数,是一对互补数。

双偶数阶幻方最经典的填法是海尔法。填写的方法是:

以8阶幻方为例:

(1)先把数字按顺序填。然后,按4×4把它分割成4块(如图)

2a7d657d8f75cf2361b3d2f0620c7600.png

(2)每个小方阵对角线上的数字

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值