C语言实现魔方阵代码及解析
问题描述
编写程序,实现如下表所示的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 |
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
C语言实现魔方阵代码及解析相关推荐
- 判断魔方阵c语言程序设计_C语言实现魔方阵代码及解析
原标题:C语言实现魔方阵代码及解析 问题描述 编写程序,实现如下表所示的5-魔方阵. 17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 1 ...
- 真分数c语言,C语言列出真分数序列代码及解析
原标题:C语言列出真分数序列代码及解析 按递增顺序依次列出所有分母为60,分子小于60的最简分数. 分子.分母只有公因数1的分数叫做最简分数或者说分子和分母是互质数的分数,叫做最简分数,又称既约分数, ...
- 用c语言输出魔方阵答案,C语言——输出“魔方阵”(带解析)
魔方阵:每一行 每一列 对角线之和均相等,要求输出n阶魔方阵 总结的五大规律: 1.把 1 放第一行中间 2.行-1 列+1 3. if(上个数1行n列) 放它下边 (i=i+2; ...
- 打印魔方阵(C语言) 所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。
打印魔方阵(C语言) 打印魔方阵,所谓魔方阵是指这样的方阵,它的每一行.每一列和对角线之和均相等.例如,三阶魔方阵为: 8 1 6 3 5 7 4 9 2 要求打印出由1到n2的自然数构成的魔方阵(n ...
- 用c语言输出魔方阵答案,如何用C语言输出一个1—16 组成的4*4的魔方阵
int b,c,d,e,f; printf("请输入魔方阵的阶数:"); scanf("%d",&b); e=b/2; d=0; for(c=1;c&l ...
- java农夫过河_C语言实现农夫过河代码及解析
问题描述 一个农夫在河边带了一只狼.一只羊和一颗白菜,他需要把这三样东西用船带到河的对岸.然而,这艘船只能容下农夫本人和另外一样东西.如果农夫不在场的话,狼会吃掉羊,羊也会吃掉白菜.请编程为农夫解决这 ...
- taxtable java_C语言计算个人所得税问题代码及解析
问题描述 编写一个计算个人所得税的程序,要求输入收入金额后,能够输出应缴的个人所得税. 个人所得税征收办法如下: ◎ 起征点为3500元: ◎ 不超过1500元的部分,征收3%: ◎ 超过1500〜4 ...
- linux求最大公约数视频,C语言求最大公约数代码及解析
问题描述 从键盘输入两个整数,求任意两个正整数的最大公约数(GCD). 最大公因数,也称最大公约数.最大公因子,指两个或多个整数共有约数中最大的一个.a,b的最大公约数记为(a,b),同样的,a,b, ...
- java梅森素数,C语言求梅森素数代码及解析
问题描述 梅森数(Mersenne Prime)指的是形如2n-1的正整数,其中指数n是素数,即为Mn.如果一个梅森数是素数,则称其为梅森素数.例如22-1=3.23-1=7都是梅森素数. 当n=2, ...
最新文章
- 雇佣和留住开发人员,打造优秀的团队
- 面试题:求最长非重复子序列
- Kali Linux 安全渗透教程第四更1.3 Kali Linux简介
- 最优化基础和机器学习优化
- ansible内置模块
- m3u8 php防盗链代码,Nginx-accesskey权限模块使用——简单的m3u8防盗链
- 这些贷款合同陷阱你知道多少?
- .Net Core下通过Proxy 模式 使用 WCF
- 微服务流控防护场景与应对措施
- js设置html不可编辑状态,JS_设置弹出页面的地址栏不可编辑
- UVA 12299 - RMQ with Shifts 线段树
- Golang Gin实践 连载十六 在图片上绘制文字
- VGG16网络,VGG19
- 中国天气网天气城市ID
- Android,上传一张本地图片到服务器,Okhttp的post请求上传图片本地服务器
- 遇见“不期而遇的美”---中华古法柴烧大师何建国
- m1/m1Pro/m1Max芯片下载win11-arm镜像
- 全景图的获取以及HTML页面显示全景图
- cocos creator2.4.4益智教育游戏源码《顶级食物链》源码H5+安卓+IOS三端源码
- ATFX:欧元兑土耳其里拉,历史最高价附近持续震荡
热门文章
- 雅加达EE:干净的板岩
- 服务网格:Istio和AWS App Mesh
- activiti脚本任务_Activiti中的高级脚本:自定义配置注入
- Spring Data Solr教程:将自定义方法添加到单个存储库
- 选择Java密码算法第1部分-散列
- nosql的数据服务_使用NoSQL实现实体服务–第2部分:合同优先
- muy bien_配置Java EE应用程序或“将Bien付诸实践”
- 学习Spring-Cloud –基础结构和配置
- JAXB众所周知的秘密
- Java 7:使用NIO.2进行文件过滤–第3部分