幻方分为3类。奇阶幻方(奇数)、双偶幻方(能够被4整除,如8,12,16……)、单偶幻方(4m+2形式,如6,10……),构造算法各不相同。

下面的程序中,奇阶幻方的构造算法为Merzirac法。双偶幻方的构造算法为Spring法。单偶幻方的构造算法为Strachey法。

奇数幻方:

在第一行居中的方格内放1,依次向右上方填入2、3、4…,如果右上方已有数字,则向下移一格继续填写。

双偶幻方:

(1) 先把数字按顺序填。然后,按4*4把它分割成2*2个小方阵 。

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

单偶幻方:

各行列对角线的和公式为:sum=n*(n^2+1)/2  n为阶数

代码如下:

#include

#include

#include

using namespace std;

int matrix[99][99] = {0};

//生成奇数幻方

void CreateOddMagicSquare(int n)

{

int x=0,y,mun =1;

y=n/2;

while ( mun <= n*n )

{

matrix[x][y] = mun;

//通过x0、y0检测右上的是否已经填入数字

int x0=x;

int y0=y;

x0--;

y0++;

//超界处理

if(x0<0)

x0+=n;

if(y0 == n)

y0= n - y0;

if(0 == matrix[x0][y0] )

{

x = x0;

y = y0;

}

else

{

//若有数字填入之前数字的下方

x++;

if(x == n)

x = x-n;

}

mun ++;

}

}

//生成双偶幻方

void CreateDoubleEvenMagicSqure( int n )

{

int num = 1;

//从1到n的平方依次赋值

for(int i=0;i

for(int j=0;j

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

//小正方形的对角线上的数字取其补数

for(int i=0;i

for(int j=0;j

{

if(i%4==0 && abs(i-j)%4 == 0)

for(int k=0;k<4;k++)

matrix[i+k][j+k] = abs( n*n +1 - matrix[i+k][j+k] );

else if (i%4==3 && (i+j)%4 == 3)

for(int k=0;k<4;k++)

matrix[i-k][j+k] = abs( n*n +1 - matrix[i-k][j+k] );

}

}

//生成单偶幻方

void CreateSingleEvenMagicSqure(int n)

{

int k = n/2;

CreateOddMagicSquare(k);

//赋初值,左上最小,右下其次,右上再次,左下最大

for(int i=0;i

for(int j=0;j

{

matrix[i+k][j+k] = matrix[i][j] + k*k;

matrix[i][j+k] = matrix[i][j] + k*k*2;

matrix[i+k][j] = matrix[i][j] + k*k*3;

}

//公式 n=4m+2

int m = (n-2) / 4;

//交换x方向正中行的从左至右m-1个

for(int i=0;i

{

int buf = matrix[k/2][i];

matrix[k/2][i] = matrix[k/2+k][i];

matrix[k/2+k][i] = buf;

}

int buf = matrix[k/2][k/2];

//以及正中间的数

matrix[k/2][k/2] = matrix[k/2+k][k/2];

matrix[k/2+k][k/2] = buf;

//交换除x正中间行的其他行对应数字m个

for(int i=0;i

for(int j=0;j

{

if(i != k/2)

{

int buf = matrix[i][j];

matrix[i][j] = matrix[i+k][j];

matrix[i+k][j] = buf;

}

}

//交换最右边m-1个数字

for(int i=0;i

for(int j=n-1;j>n-1-(m-1) ; j--)

{

int buf = matrix[i][j];

matrix[i][j] = matrix[i+k][j];

matrix[i+k][j] = buf;

}

}

//幻方正确检查

bool Check(int n)

{

int sum = (n*(n*n+1))/2;

int SumA=0,SumB=0;

for(int i=0;i

{

for(int j=0;j

SumA += matrix[i][j];

if(SumA != sum)

return false;

SumA = 0;

}

for(int i=0;i

{

for(int j=0;j

SumA += matrix[j][i];

if(SumA != sum)

return false;

SumA = 0;

}

for(int i=0;i

{

SumA+=matrix[i][i];

SumB+=matrix[i][n-i-1];

}

if(SumA!=sum||SumB!=sum)

return false;

return true;

}

int main()

{

int n;

cin>>n;

if(n%2!=0)

CreateOddMagicSquare(n);

else if (n%4 == 0)

CreateDoubleEvenMagicSqure(n);

else if (n%2 == 0)

CreateSingleEvenMagicSqure(n);

for(int i=0;i

{

for(int j=0;j

cout<

cout<

}

if(!Check(n))

cout<

else

cout<

system("pause");

return 1;

}

双偶幻方的c语言算法,任意阶幻方的c++实现----奇阶幻方、双偶幻方、单偶幻方。...相关推荐

  1. 双偶幻方的c语言算法,单偶阶、双偶阶幻方的巧妙填法

    单偶阶.双偶阶幻方的巧妙填法 单偶阶.双偶阶幻方的巧妙填法 人气:150 ℃时间:2019-12-07 19:18:09 优质解答 一.双偶幻方的解法 能被4整除的n阶幻方叫双偶幻方,如8阶.12阶. ...

  2. 任意阶幻方的c++实现----奇阶幻方、双偶幻方、单偶幻方。

    幻方分为3类.奇阶幻方(奇数).双偶幻方(能够被4整除,如8,12,16--).单偶幻方(4m+2形式,如6,10--),构造算法各不相同. 下面的程序中,奇阶幻方的构造算法为Merzirac法.双偶 ...

  3. 重温c语言 谭浩强 输出魔方阵 目前只做了基数魔方 以及 双偶幻方,单偶同理

    基数魔方阵 1>第一行中间位取值1 2>然后 后面的n*n -1 个数按以下规则 下一个数是前一个数的  行-1 列 +1  若是行是0 则为n-1:若列是n-1,则为0:若定位后的pos ...

  4. C语言求任意两个矩阵相乘的算法(初学尝试矩阵乘法)

    C语言求任意两个矩阵相乘的算法(不同于大部分规格固定的矩阵乘法) 结果图如下   : 代码如下: //----- 任意两个矩阵相乘 # include <stdio.h> int main ...

  5. matlab图像剖线,一种在等值线图上任意截取剖面的Matlab语言算法

    第25卷 第3期 2003年8月 物探化探计算技术 V ol 125N o .3 A ug .2003COM PU T I N G T ECHN I Q U ES FOR GEO PH YS I CA ...

  6. c语言单片机求最小公倍数,单片机常用的14个C语言算法,要熟记在心哦!

    原标题:单片机常用的14个C语言算法,要熟记在心哦! 算法(Algorithm):计算机解题的基本思想方法和步骤. 算法的描述:是对要解决一个问题或要完成一项任务所采取的方法和步骤的描述,包括需要什么 ...

  7. 编写一个字节数的rtu C语言校验程序,Modbus通信协议中CRC校验的快速C语言算法

    Modbus通信协议中CRC校验的快速C语言算法 2004年第11期 福 建 电 脑 63 Modbus通信协议中CRC校验的快速C语言算法 孟开元 (西安石油大学计算机学院陕西西安710065) [ ...

  8. 算法与数据结构c语言版PPT,C语言算法与数据结构.ppt

    C语言算法与数据结构.ppt 第十二章 算法与数据结构12.1 算法的基本概念,该节知识点所占试题比重为12,属于重点考查对象,基本上每次必考,主要考查算法的定义和对算法复杂度的理解.历次试题分值在0 ...

  9. c语言中闰年的流程图_C语言-算法与流程图

    <C语言-算法与流程图>由会员分享,可在线阅读,更多相关<C语言-算法与流程图(22页珍藏版)>请在人人文库网上搜索. 1.目录,第一章 绪论 第二章 算法与流程图 第三章 数 ...

  10. C语言-输入任意多个数字,存到整型数组,支持任意间隔符,同时支持输入字母存到字符数组中

    第一次在CSDN上写博客- 记录一下想了有那么久的,这串代码 起因是做应用密码学的作业时,有Vigenere密码的加密解密.仿射密码加密解密.Playfair算法.Hill密码 因为数据量比较大,要把 ...

最新文章

  1. 【imx6】libipu.so.0说明
  2. 广东省哈工大(深圳)赛区赛事活动安排
  3. JAVA 设计模式 : 状态模式
  4. 帝国cms php点击删除,帝国CMS删除内容非本站链接的方法(非插件)
  5. 修复IE主页被篡改劫持的方法之一:自定义xxx.reg文件
  6. Macbook 2021 M1pro 安装 SentencePiece
  7. 设置vs2107背景图片
  8. 8本必读关于人工智能伦理问题、社会价值及影响书籍推荐
  9. 【林轩田】机器学习基石(九)——线性回归
  10. 起始2021-01-15
  11. uniapp-上传图片、上传视频
  12. ParaView整体介绍
  13. php在线打包(hacklog修改版),wordpress配置记录
  14. mysql lag和lead_Oracle的LAG和LEAD分析函数
  15. Pyramid 简介
  16. 南京邮电大学微型计算机原理与接口技术答案,微型计算机原理与接口技术南京邮电大学...
  17. LSM 树(Log-Structured Merge-Tree) 原理
  18. python constrain_python约束 – 约束金额
  19. RFID基础---频率、卡类型
  20. 圆与圆的位置关系题目含答案_中考总复习:圆的专题复习-圆的性质及与圆有关的位置关系考点分析...

热门文章

  1. 数仓指标体系--建设方法
  2. 14、文件的上传和下载
  3. Zookeeper特点及理解
  4. kali无线破解实战
  5. DL | DeepDream过程和原理概要
  6. delphi7中的局部变量和全局变量
  7. 第一章:J2EE高级软件工程师面试题集
  8. 一些Winodws mobile相关资料的整理
  9. 仿支付宝实现密码框输入
  10. 王者荣耀游戏时间计算机制,王者荣耀荣耀战力怎么算,荣耀战力计算机制详解...