题6.7:使用C语言输出魔方阵(此方法最容易理解且最简便)输出“魔方阵”--每一行,每一列和对角线之和均相等。求:1-n^2的自然数构成的魔方阵。

题目

本题是谭浩强《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.主函数部分

代码如下(示例):

int main() {
	int a[100][100] = { 0 };
	int N;//N用来表示魔方阵的阶数
	int col,row=0;//定义行数和列数
	int prerow = 0, precol = 0;//前一个元素所在的行和列
	int i, j;
	while (1) {
		printf("请输入魔方阵的阶数,在3-100之间的奇数:");
		scanf("%d", &N);
		if (0 != N && (N >= 3 && N < 100))
			break;//用于判断输入的是否为3-100之间的奇数,因为我们求的是奇数魔方阵
	}
	col = N / 2;
	a[row][col] = 1;//用于存放第0行中间的位置置为1,row初值已为0
	//对于剩下的N*N-1个元素,按照以下规则来进行存放
	for (i = 2; i <= N * N; i++)//i代表赋值的次数
	{
		row--;
		col++;
		if (row < 0)
			row = N - 1;
		if (col >= N)
			col = 0;//这两个for循环的功能是把魔方阵看成是回绕的。
		if (a[row][col] != 0)//说明row,col这个位置上已经有元素了,则下一个元素存放在当前列的下一行
		{
			row = prerow + 1;
			col = precol;
		}
		a[row][col] = i;//真正的主语句-赋值语句,前面的条件都要经过这个赋值语句。
		prerow = row;
		precol = col;//存放前一个元素所在的行和列
	}
	//将魔方阵进行输出
	for (i = 0; i < N; i++){
		for (j = 0; j < N; j++)
			printf("%4d", a[i][j]);
		printf("\n");
	}
	return 0;
}

三、执行结果

在这里插入图片描述

输入:

3

输出:

   8   1   6
   3   5   7
   4   9   2
  • 15
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

立志冲海大

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

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

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

打赏作者

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

抵扣说明:

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

余额充值