幻方算法的所有情况描述及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阶幻方:

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

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

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

以8阶幻方为例:

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

(2)每个小方阵对角线上的数字(如左上角小方阵部分),换成和它互补的数。

三、单偶数阶幻方(斯特拉兹法)

所谓单偶阶幻方就是当n不可以被4整除时的偶阶幻方,即4K+2阶幻方。如(n=6,10,14……)的幻方。

单偶数阶幻方最经典的填法是斯特拉兹法。填写的方法是:

以10阶幻方为例。这时,k=2。(1)把魔方阵分为A,B,C,D四个象限,这样每一个象限肯定是奇数阶。用罗伯法,依次在A象限,D象限,B象限,C象限按奇数阶幻方的填法填数。

(2)在A象限的中间行、中间格开始,按自左向右的方向,标出k格。A象限的其它行则标出最左边的k格。将这些格,和C象限相对位置上的数互换位置。

(3)在B象限所有行的中间格,自右向左,标出k-1格。(注:6阶幻方由于k-1=0,所以不用再作B、D象限的数据交换),将这些格,和D象限相对位置上的数互换位置。

C语言代码如下(才疏学浅代码尽力了)

#include

#include

int laobo(int n,int **arr,int num)

//劳伯法 用于计算奇数阶的情况

{

int i, j, k;

i = 0;

j = n / 2;

for (k = num;k <=num+n*n-1;k++)

//num代表第一个数 之所以引入这个num是因为后面有个函数需要

//一般来说  是以1开始

{

arr[i][j] = k;

if (arr[(i - 1 + n) % n][(j + 1 + n) % n] == 0)

{

i = (i - 1 + n) % n;

j = (j + 1 + n) % n;

}

else

{

i= (i + 1 + n) % n;

}

}

return 0;

}

int Init(int n, int **arr)

{

//初始化数组 形成 1 2 3 4

//                5 6 7 8.....这类

//为海尔法做好基础

int i, j, num;

num = 1;

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

{

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

{

arr[i][j] = num++;

}

}

return 0;

}

int haier(int n, int **arr)//被4整除时用该函数

{

int i, j, complement, deg;//complement表示互补数 即n*n+1

//deg表示n/4 因为要分成4*4的

complement = n*n + 1;

deg = n / 4;

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

{

for (j = 0;j < deg;j++)

{

arr[i * 4 + 0][j * 4 + 0] = complement - arr[i * 4 + 0][j * 4 + 0];

arr[i * 4 + 0][j * 4 + 3] = complement - arr[i * 4 + 0][j * 4 + 3];

arr[i * 4 + 1][j * 4 + 1] = complement - arr[i * 4 + 1][j * 4 + 1];

arr[i * 4 + 1][j * 4 + 2] = complement - arr[i * 4 + 1][j * 4 + 2];

arr[i * 4 + 2][j * 4 + 1] = complement - arr[i * 4 + 2][j * 4 + 1];

arr[i * 4 + 2][j * 4 + 2] = complement - arr[i * 4 + 2][j * 4 + 2];

arr[i * 4 + 3][j * 4 + 0] = complement - arr[i * 4 + 3][j * 4 + 0];

arr[i * 4 + 3][j * 4 + 3] = complement - arr[i * 4 + 3][j * 4 + 3];

}

}

return 0;

}

int late(int n, int **arr)

{

int deg;

int k;

int temp;

int i, j;

deg = n / 2;

//laobo(deg,n, arr, x, y, num);//用laobo法填充A象限

//laobo(deg,n, arr, x+deg, y+deg, num+deg*deg);//用laobo法填充D象限

//laobo(deg,n, arr, x+deg, y, num+2*deg*deg);//用laobo法填充B象限

//laobo(deg,n, arr, x, y+deg, num+3*deg*deg);//C

int **a;

a = (int **)malloc(sizeof(int*)*deg);

for (int m = 0;m < deg;m++)

a[m] = (int *)malloc(sizeof(int)*deg);

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

for (j = 0;j < deg;j++)

a[i][j] = 0;

laobo(deg, a, 1);

for (i = 0;i < deg;i++)//A象限赋值

for (j = 0;j < deg;j++)

{

arr[i][j] = a[i][j];

}

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

for (j = 0;j < deg;j++)

a[i][j] = 0;

laobo(deg, a, 1+deg*deg);

for (i = 0;i < deg;i++)//D象限赋值

for (j = 0;j < deg;j++)

{

arr[i+deg][j+deg] = a[i][j];

}

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

for (j = 0;j < deg;j++)

a[i][j] = 0;

laobo(deg, a, 1 + 2*deg*deg);

for (i = 0;i < deg;i++)//B象限赋值

for (j = 0;j < deg;j++)

{

arr[i][j + deg] = a[i][j];

}

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

for (j = 0;j < deg;j++)

a[i][j] = 0;

laobo(deg, a, 1 + 3*deg*deg);

for (i = 0;i < deg;i++)//C象限赋值

for (j = 0;j < deg;j++)

{

arr[i + deg][j] = a[i][j];

}

k = (n - 2) / 4;

for (i = 0;i < deg;i++)//实现了AC象限前k个数的交换

{

for (j = 0;j < k;j++)

{

temp = arr[i][j];

arr[i][j] = arr[i + deg][j];

arr[i + deg][j] = temp;

}

}

for (j = 0;j < k;j++)//因为A象限中间行是从中间格开始换的

//所以我们要将前面替换了的前k格给替换回来

{

temp = arr[deg / 2][j];

arr[deg / 2][j] = arr[deg / 2 + deg][j];

arr[deg / 2 + deg][j] = temp;

}

//替换中间格开始的k个

for (j = deg/2;j

{

temp = arr[deg / 2][j];

arr[deg / 2][j] = arr[deg / 2 + deg][j];

arr[deg / 2 + deg][j] = temp;

}

if (k != 0)

{

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

for (j = deg + deg / 2;j < ((deg + deg / 2) + k - 1);j++)

{

temp = arr[i][j];

arr[i][j] = arr[i + deg][j];

arr[i + deg][j] = temp;

}

}

return 0;

}

int main()

{

int **arr;//二级指针动态申请二维数组

int n;

int i, j;

printf("请输入你想打印几阶幻方:");

scanf("%d",&n);

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

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

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

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

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

arr[i][j] = 0;

if (n % 2 != 0)

{

laobo(n, arr,1);

}

else if (n % 4 == 0)

{

Init(n, arr);

haier(n, arr);

}

else

{

late(n, arr);

}

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

{

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

{

printf("%4d", arr[i][j]);

}

printf("\n");

}

return 0;

}

emmm 看不懂私信我吧。。

幻方c语言程序,幻方算法 C语言描述相关推荐

  1. 欧拉方法c语言程序,欧拉回路算法C语言

    这个东西,从研究到写完,用了18小时.是我太笨了吗?不过还好,总算是写出来了. 收拾收拾,准备去那个城市考察一下.但愿带回真实的数据供我参考. /*9-32(a)-12-29-21.48.c -- 第 ...

  2. 8255a初始化c语言程序,8255A的c语言程序.doc

    8255A的c语言程序 8255A的c语言程序 [实例24]用8243扩展I/O端口 #include sbit ContrBit0=P1^0; sbit ContrBit1=P1^1; sbit C ...

  3. c语言程序员算法题库,100个超级经典地C语言算法,程序员必须练习.doc

    实用标准文案 文档大全 POJ上做做ACM的题 语言的学习基础,100个经典的算法 C语言的学习要从基础开始,这里是100个经典的算法-1C语言的学习要从基础开始,这里是100个经典的算法 题目:古典 ...

  4. 小型温控系统c语言程序,pid算法温度控制c语言程序 - 全文

    温度控制PID自整定原理介绍 整定PID(三模式)控制器 整定温度控制器涉及设置比例.积分和微分值,以得到对特定过 程的可能的最佳控制.如果控制器不包含自动整定算法,或者自 动整定算法未提供适合特定应 ...

  5. c语言程序二分法求解,C语言二分法查找算法(附带源码)

    顺序查找是从第一个数据开始比较,直到找到目标数据.当数据量较大时,顺序查找的效率就会降低. 将数据进行排序以后,我们就可以使用另一种更加有效的查找方法:二分法查找.二分法查找的思想是,对于已经按照从小 ...

  6. 怎么用centos7运行c语言程序_写C语言程序,如何提升程序运行效率?我的一点经验分享给你们!...

    在编写C语言程序后,经常需要对源码进行优化,以提高程序的运行效率,下面简述几个常用的优化技巧以供大家参考: 1.C于代码在程序中的优化 现在的C编译器会自动对代码进行优化,但这些优化是对执行速度和代码 ...

  7. 函数c语言桶排算法,C语言基本排序算法之桶式排序实例

    本文实例讲述了C语言基本排序算法之桶式排序.分享给大家供大家参考,具体如下: 桶式排序是对一个有n个整型元素的数组a[n],其中对任意i,0 <= a[i] <= m的特殊排序算法. 可以 ...

  8. c语言程序的引言,C语言程序设计-第1章-引言

    <C语言程序设计-第1章-引言>由会员分享,可在线阅读,更多相关<C语言程序设计-第1章-引言(80页珍藏版)>请在人人文库网上搜索. 1.c语言编程,2,1 .你为什么学这门 ...

  9. c语言程序考试试题,C语言程序设计期末考试试题(含答案)

    <C语言程序设计期末考试试题(含答案)>由会员分享,可在线阅读,更多相关<C语言程序设计期末考试试题(含答案)(6页珍藏版)>请在人人文库网上搜索. 1.C 语言程序设计期末考 ...

  10. c语言程序编程线性方程,C语言编程求解线性方程.doc

    C语言编程求解线性方程 本 科 专 业 学 年 论 文 题目:线性方程组求解方法比较 姓 名 郭 凤 专 业 计算机科学与技术专业 班 级 08级本科(2)班 指导教师 刘 晓 娜 完成日期:2010 ...

最新文章

  1. virtualbox硬件加速_VirtualBox 安装Ubuntu虚拟机卡顿 加速方法以及出现的问题
  2. VTK:PolyData之GetMiscPointData
  3. Codeforces Round #448 (Div. 2)
  4. Photoshop CS5完全自学实战实例视频教程
  5. 低代码,填补业务技术鸿沟 or 紧贴业务的开发时代?
  6. keepalived+LVS实现高可用的Web负载均衡
  7. 数组 最大差值_【每日算法Day 97】经典面试题:求两个数组最小差
  8. java面试要点---基础部分CoreJava,基础及语法
  9. 《JavaScript 模式》读书笔记
  10. Transfer-Encoding
  11. 同台同时多开DELPHI2007的解决办法
  12. 微博html5到桌面,微博正文-微博HTML5版
  13. 无法定位序数XX于动态链接库XX.dll的解决的方法
  14. 勤做眼保健操,减轻眼睛疲劳
  15. v4l2架构专题模块handler分析 --- handler的初始化及handler ctrl注册
  16. 甲骨文中国良心裁员:首批900人,赔偿N+6
  17. “科林明伦杯”哈尔滨理工大学第十届程序设计竞赛(同步赛) E
  18. vue网易云歌单案例
  19. SAP 批导长文本字段自动和手动换行
  20. 线性回归基础相关公式

热门文章

  1. 挖金矿 详解(C++)
  2. python多任务之——线程简述
  3. 题目243-交换输出
  4. 鸡蛋掉落----经典dp(动态规划)
  5. python json转xml_Python实现XML到JSON的转换并编写,python,xml,转化,为,Json,进行,写入
  6. mysql数据迁移性能_百万级MySQL的数据量,该如何快速的完成数据迁移?
  7. centos 的命令背景能改吗_精装改毛坯,“降价”促销?“以价换量”还能走得通吗?...
  8. 知识竞赛系统的计时器数字或滚动抽签数字不显示的原因解惑
  9. springCloud Alibaba 与 nacos
  10. 001_动力节点_SpringMVC4_SpringMVC简介