题6.7:全网最详细的用C语言求奇数n阶魔方阵代码,每一步都有注释,送给对魔方阵感到困惑的你,保证你能看懂并学会。

题目

本题是谭浩强《C程序设计课后习题》题6.7。
题目:输出“魔方阵”–每一行,每一列和对角线之和均相等。
例:3阶魔方阵
8 1 6
3 5 7
4 9 2
求:1-n^2的自然数构成的魔方阵。


以下是本篇文章正文内容,欢迎朋友们进行指正,一起探讨,共同进步。——来自考研路上的lwj

一、解题思路

思路:
首先我们来了解一下魔方阵的生成方法:
1.先把第0行中间置为1.
2.下一个元素放在当前元素的上一行,下一列。
x=a[i-1][j+1]
3.如果上一行,下一列已有元素,则下一个元素存放在当前列的下一行。
x=a[i+1][j]
4.把矩阵看成是回绕的(像个球卷起来那样)
if i<0 i=最后一行
if j>size j=0
最后大家可以直接去看代码部分,基本上每一步我都标注了相关注释,程序易读性很高。

二、代码部分

1.引入库

代码如下(示例):

#include<stdio.h>

2.主函数部分

代码如下(示例):

void main()
{
	int n;//用于表示魔方阵的阶数
	printf("请输入一个3-100之间的奇数,用于做魔方阵的阶数:");
	scanf("%d", &n);
	int a[100][100] = { 0 };//先定义一个阶数最大为100的未赋值的魔方阵。
	int  row, col;//定义两个变量用于存放魔方阵的行和列
	int prerow, precol ;//定义两个变量用来存放当前行和列的值
	row = 0;
	col = n / 2;
	a[row][col] = 1;//1.先把第0行中间的元素置为1.
	int i, j;
	for (i = 2; i <= n * n; i++)//因为已经赋值了一个1,所以i从2开始,需要赋值n*n-1次
	{
		row--;
		col++;//2.下一个元素放在当前元素的上一行,下一列。
		if (row < 0)
			row = n - 1;//如果行是第-1行,就把他换成最后一行
		if (col >= n)
			col = 0;//如果列到达了-1列(也就是超过了最后一列),就将其置为第1列
		//4.这两句的功能是把矩阵看成是回绕的(像个球卷起来那样)
		if (a[row][col] != 0)//3.如果上一行,下一列已有元素,则下一个元素存放在当前列的下一行。
		{
			row = prerow + 1;//prerow是当前行+1就是下一行。
			col = precol;//precol是当前列,不用变化。
		}
		a[row][col] = i;//这句代码是给魔方阵赋值的唯一语句,经过上面的3个if条件后,到这里进行相应的赋值。
		prerow = row;
		precol = col;//记录下来当前行和列的值
	}
	for (i = 0; i < n; i++)//用于输出已赋值后的n阶魔方阵
	{
		for (j = 0; j < n; j++)
			printf("%-4d", a[i][j]);
		printf("\n");
	}
}

三、执行结果

在这里插入图片描述

输入:

请输入一个3-100之间的奇数,用于做魔方阵的阶数: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
  • 9
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

立志冲海大

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值