C语言实现魔方阵代码及解析

问题描述

编写程序,实现如下表所示的5-魔方阵。

17241815
23571416
46132022
101219213
11182529

5-魔方阵

问题分析

所谓“n-魔方阵”,指的是使用1〜n2共n2个自然数排列成一个n×n的方阵,其中n为奇数;该方阵的每行、每列及对角线元素之和都相等,并为一个只与n有关的常数,该常数为n×(n2 1)/2。

例如4-魔方阵,其第一行、第一列及主对角线上各元素之和如下:

  • 第一行元素之和:17 24 1 8 15=65

  • 第一列元素之和:17 23 4 10 11=65

  • 主对角线上元素之和:17 5 13 21 9=65

而 n×(n2 1)/2=5×(52 1)/2=65 可以验证,5-魔方阵中其余各行、各列及副对角线上的元素之和也都为65。
假定阵列的行列下标都从0开始,则魔方阵的生成方法为:在第0行中间置1,对从2开始的其余n2-1个数依次按下列规则存放:
(1) 假定当前数的下标为(i,j),则下一个数的放置位置为当前位置的右上方,即下标为(i-1,j 1)的位置。
(2) 如果当前数在第0行,即i-1小于0,则将下一个数放在最后一行的下一列上,即下标为(n-1,j 1)的位置。
(3) 如果当前数在最后一列上,即j 1大于n-1,则将下一个数放在上一行的第一列上,即下标为(i-1,0)的位置。
(4) 如果当前数是n的倍数,则将下一个数直接放在当前位置的正下方,即下标为(i 1,j)的位置。

算法设计

在设计算法时釆用了下面一些方法:

  • 定义array()函数,array()函数的根据输入的n值,生成并显示一个魔方阵,当发现n不是奇数时,就加1使之成为奇数。

  • 使用动态内存分配与释放函数malloc()与free(),在程序执行过程中动态分配与释放内存,这样做的好处是使代码具有通用性,同时提高内存的使用率。

在分配内存时还要注意,由于一个整型数要占用两个内存,因此,如果魔方阵中要存放的数有max个,则分配内存时要分配2*max个单元,从而有malloc(max max)。在malloc()函数中使用max max而不是2*max是考虑了程序运行的性能。显然应该使用二维数组来表示魔方阵,但虽然数组是二维形式的,而由于内存是一维线性的,因此在存取数组元素时,要将双下标转换为单个索引编号。在程序中直接定义了指针变量来指向数组空间,即使用malloc()函数分配的内存。

下面是完整的代码:

#include
#include

int array(int n)
{
    int i, j, no, num, max;
    int *mtrx;
    if(n%2 == 0)  /*n是偶数,则加1使其变为奇数*/
    {
        n=n 1;
    }
    max=n*n;
    mtrx=(int *)malloc(max max);  /*为魔方阵分配内存*/
    mtrx[n/2]=1;  /* 将1存入数组*/
    i=0;  /*自然数1所在行*/
    j=n/2;  /*自然数1所在列*/
    /*从2开始确定每个数的存放位置*/
    for(num=2; num<=max; num )
    {
        i=i-1;
        j=j 1;
        if((num-1)%n == 0)  /*当前数是n的倍数*/
        {
            i=i 2;
            j=j-1;
        }
        if(i<0)  /*当前数在第0行*/
        {
            i=n-1;
        }
        if(j>n-1)  /*当前数在最后一列,即n-1列*/
        {
            j=0;
        }
        no=i*n j;  /*找到当前数在数组中的存放位置*/
        mtrx[no]=num;
    }
    /*打印生成的魔方阵*/
    printf("生成的%d-魔方阵为:",n);
    no=0;
    for(i=0; i    {
        printf("\n");
        for(j=0; j        {
            printf("=", mtrx[no]);
            no ;
        }
    }
    printf("\n");
    free(mtrx);
    return 0;
}

int main()
{
    int n;
    printf("请输入n值:\n");
    scanf("%d", &n);
    array(n);  /*调用array函数*/
    return 0;
}

运行结果:

linuxidc@linuxidc:~$ ./linuxidc
请输入n值:
5
生成的5-魔方阵为:
 17 24  1  8 15
 23  5  7 14 16
  4  6 13 20 22
 10 12 19 21  3
 11 18 25  2  9

知识点补充

在解决该问题时,采用的是动态分配内存的方式,并使用了指针变量mtrx来指向二维数组中的元素。在算法设计中,要存储魔方阵需要一个二维数组,因此再给出直接使用二维数组来生成8-魔方阵的程序。

直接使用二维数组生成5-魔方阵的代码如下:

#include
#define N 8
int main()
{
    int a[N][N]={0}, i, j, k, t, x, y;
    i=0;  /*自然数1的行标*/
    j=N/2;  /*自然数1的列标*/
    t=N-1;  /*最后一行、最后一列的下标*/
    for(k=1; k<=N*N; k )
    {
        a[i][j]=k;
        x=i;
        y=j;
        if(i == 0)
            i=t;
        else
            i=i-1;
        if(j != t)
            j=j 1;
        else
            j=0;
        if(a[i][j]!=0)
        {
            i=x 1;
            j=y;
        }
    }
    printf("linuxidc.com生成的8-魔方阵为:");
    for(i=0; i    {
        printf("\n");
        for(j=0; j        {
            printf("=", a[i][j]);
        }
    }
    printf("\n");
    return 0;
}

示例输出如下:

linuxidc.com生成的8-魔方阵为:
 41 43 53 63  1 11 21 31
 42 52 62  8 10 20 30 40
 51 61  7  9 19 29 39 49
 60  6 16 18 28 38 48 50
  5 15 17 27 37 47 57 59
 14 24 26 36 46 56 58  4
 23 25 35 45 55  0  3 13
 32 34 44 54 64  2 12 22

来源:https://www.linuxidc.com/Linux/2018-10/155082.htm

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/339054.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

600度近视眼恢复方法_近视孩子的家长看看:600度以上近视可致盲,不花钱恢复视力法...

现在孩子近视早已经不是什么新鲜事了&#xff0c;一个班级里面有3分之一的孩子都近视&#xff0c;数据显示&#xff1a;目前中国学生近视发病率接近60%&#xff0c;居世界首位&#xff01;中小学生近视率已达34.6%&#xff0c;高中近视率已达70%。患者人数超过六千万&#xff0…

xbox360 功率测试软件,【外星人 Alpha ASM100-1580 游戏主机使用总结】性能|电压|功耗|跑分_摘要频道_什么值得买...

外星人 Alpha ASM100-1580 游戏主机使用总结(性能|电压|功耗|跑分)在讨论性能之前&#xff0c;再最后看一看电源。NUC电源外置是必然&#xff0c;除了体积之外&#xff0c;还要考虑散热&#xff0c;所以&#xff0c;电源外置至少在目前来看还是最优解。这款电源是台达电子代工的…

openfire消息通知推送_微信小游戏内测「订阅消息」能力,这是召回用户的「大杀器」吗?...

作者&#xff1a;蒋鸿昌本文来源于「知晓程序」公众号。知晓云后端云服务&#xff0c;让你的小程序开发快人一步&#xff0c;添加「minsupport3」了解详情。知晓云​cloud.minapp.com一位投资人曾把最近 3 年微信公开课 Pro 版上张小龙的演讲称为「小程序 3 篇」&#xff1a;如…

api 数据gzip压缩_如何使用GZip和Jersey压缩Java REST API中的响应

api 数据gzip压缩在某些情况下&#xff0c;您的REST api会提供非常长的响应&#xff0c;我们都知道移动设备/网络上的传输速度和带宽仍然非常重要。 我认为这是开发支持移动应用程序的REST api时需要解决的第一个性能优化点。 你猜怎么了&#xff1f; 因为响应是文本&#xff0…

c语言心形告白代码实现

1.彩色告白includeincludeincludeincludedefine U 0.1define V 0.053void SetColor(unsigned short ForeColor,unsigned short BackGroundColor){HANDLE hConGetStdHandle(STD_OUTPUT_HANDLE);SetConsoleTextAttribute(hCon,(ForeColor)|(BackGroundColor16));}int main(){int …

obs可以推到中转服务器吗,能否使用OBS(Open Broadcaster Software)、FMLE(Flash Media Live Encoder)等第三方软件进行推流?...

"可以。请参考以下方法进行设置。使用OBS进行直播设置 > 串流 > 串流类型&#xff1a;自定义流媒体服务器URL&#xff1a;填写网易服务器提供的推流地址中&#xff0c;从头到live的部分&#xff0c;例如&#xff1a;rtmp://p12345678.live.126.net/live流密钥&#…

mysql 隐藏中间四位_MySQL知识体系——索引

本文直切主题&#xff0c;针对InnoDB引擎描述索引及优化策略。在开始之前&#xff0c;需要读者了解&#xff1a;二叉查找树(包括2-3查找树、红黑树等数据结构)MySQL的InnoDB引擎基础知识索引初探要了解索引&#xff0c;当然要了解其数据结构。树有很多应用&#xff0c;流行的用…

python中属于私有属性的是_Python中的实例属性和私有属性

相关知识点 实例属性 实例属性和类属性的区别在于实例属性定义在类的__init__()魔法方法中&#xff0c;而类属性定义在类下&#xff1a; 1 classC:2 b 1 #类属性 3 4 def __init__(self):5 self.x None #实例属性 对于类属性这里不做说明&#xff0c;主要描述实例属性&#x…

osgi cxf_所有OSGi套件的通用CXF请求拦截器

osgi cxf几个月以来&#xff0c;我一直在研究Apache CXF&#xff0c;Karaf和Felix&#xff0c;我发现所有这些捆绑技术都非常有趣。 在处理一些用例时&#xff0c;我陷入一种情况&#xff0c;即我只需要一个Interceptor即可在发送到Karaf应用程序下部署的任何捆绑包的每个HTTP请…

听说,高手都用记事本写C语言代码?

坊间传闻高手都喜欢用记事本写代码&#xff0c;那么问题来了&#xff0c;我们以C语言为例&#xff0c;如何用记事本编译运行呢&#xff1f;其实&#xff0c;最简单的方式就是安装GCC编译器&#xff0c;在记事本编写C语言程序&#xff0c;然后再在命令行用GCC编译运行。下面&…

精简指令和复杂指令计算机,CPU精简指令集和复杂指令集的区别

经常看到计算机课程上介绍PowerPC是采用精简指令集的CPU&#xff0c;酷睿CPU是复杂指令集。那么到底精简指令集和复杂指令集有什么区别呢&#xff1f;以下内容摘自百度百科&#xff1a;在计算机指令系统的优化发展过程中&#xff0c;出现过两个截然不同的优化方向&#xff1a;C…

均值差异大但是t检验不显著_T检验原理及介绍

T检验原理及应用介绍一、T检验的应用场景&#xff1a;应用场景&#xff1a;可以用于研究工艺更改前后对于产品质量是否有显著提高&#xff1b;研究不同的热处理温度对于产品性能&#xff0c;晶粒度等是否有明显效果&#xff1b;研究不同的设备或人员对于产品质量的影响是否有差…

javafx ui_调用以验证JavaFX UI的响应能力

javafx ui最近&#xff0c;吉姆韦弗&#xff08;Jim Weaver&#xff09;在他的Surface Pro上安装了我的小图片索引应用“ picmodo”作为演示&#xff0c;图形用户界面&#xff08;GUI&#xff09;变成了垃圾。 显然&#xff0c;Windows Tablet上JavaFX的基本字体大小很高&…

python中mean的用法_Python statistics mean()用法及代码示例

先决条件&#xff1a;统计函数简介 在数据分析和统计方面&#xff0c;Python是一种非常流行的语言。幸运的是&#xff0c;Python3提供了statistics模块&#xff0c;它具有非常有用的功能&#xff0c;例如mean()&#xff0c;median()&#xff0c;mode()等等 mean()函数可用于计算…

C语言多文件编程基本格式

1、背景&#xff1a;用一个丢骰子的简单案例熟悉了C语言多文件编程该咋写2、格式&#xff08;1&#xff09;主函数文件main.c//文件头part1:所有要使用的函数#include ;#include ;#include ;//文件头part2:放所有函数原型的文件#inlucde "main.h"//文件头part3&#…

微软project服务器搭建,Project Professional 版本(Project Server 2010 设置)

Project Professional 版本利用“Project Professional 版本”&#xff0c;您可以指定将能够连接到 Project Server 2010 环境的 Project Professional 客户端的版本(内部版本号)。可通过此设置确保与服务器的 Project Professional 客户端连接都处于所需的基本级别。例如&…

众辰nz200变频器使用说明书_ABB变频器

ABB变频器&#xff0c;广州丰电自动化设备有限公司是一家专业从事工业计算机、工业自动化产品、电线电缆、仪器仪表销售、安装、维修&#xff1b;变频控制系统、变频恒压供水系统、变频节能系统的设计及安装&#xff0c;提供自动化工程技术服务及成套解决方案于一体的科技企业。…

pb 执行存储过程带参数_PB级海量数据服务平台架构设计实践

基于PB级海量数据实现数据服务平台&#xff0c;需要从各个不同的角度去权衡&#xff0c;主要包括实践背景、技术选型、架构设计&#xff0c;我们基于这三个方面进行了架构实践&#xff0c;下面分别从这三个方面进行详细分析讨论&#xff1a;实践背景该数据服务平台架构设计之初…

4g的服务器mysql配置文件,服务器物理内存16G mysql数据库my.cnf配置及参数说明

搜索热词《服务器物理内存16G MysqL数据库my.cnf配置及参数说明》要点&#xff1a;本文介绍了服务器物理内存16G MysqL数据库my.cnf配置及参数说明&#xff0c;希望对您有用。如果有疑问&#xff0c;可以联系我们。导读&#xff1a;服务器物理内存16G MysqL数据库my.cnf配置及参…

C语言*运算符和运算符

取址运算符&用来取得其操作数的地址。如果操作数 x 的类型为 T&#xff0c;则表达式 &x 的类型是 T 类型指针&#xff08;指向 T 的指针&#xff09;。取址运算符的操作数必须是在内存中可寻址到的地址。换句话说&#xff0c;该运算符只能用于函数或对象&#xff08;例…