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

2023-05-16

题目

本题是谭浩强《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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐