题目
本题是谭浩强《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