题目描述
输出魔方阵。所谓魔方阵是指该方阵的每一行、每一列和对角线之和均相等。
例如:
8 1 6
3 5 7
4 9 2
输入格式:
输入一个整数n,1<=n<=15。
输出格式:
输出结果,每个数字占5个域宽。
输入样例:
在这里给出一组输入。例如:
3
输出样例:
在这里给出相应的输出。例如:
8 1 6
3 5 7
4 9 2
代码:
#include <stdio.h>
#define MAX_N 15
void printMagicSquare(int n) {
int i, j;
int square[MAX_N][MAX_N];
// 初始化数组为0
for (i = 0; i < n; ++i) {
for (j = 0; j < n; ++j) {
square[i][j] = 0;
}
}
// 填充魔方阵
int num = 1;
i = 0;
j = n / 2;// 1的起始位置
while (num <= n * n) {
if (square[i][j] != 0) {
i = (i - 1 + n) % n;// 如果该位置已经有值
j = (j - 1 + n) % n;// 则再右移一个单位,但是要下移一个单位,否则将无限循环
continue;
}
square[i][j] = num++;
i = (i - 1 + n) % n;// 下次填充的位置
j = (j + 1 + n) % n;// i+1 j-1 及右移一个单位,再上移一个单位
}
// 输出魔方阵
for (i = 0; i < n; ++i) {
for (j = 0; j < n; ++j) {
printf("%5d", square[i][j]);
}
printf("\n");
}
}
int main() {
int n;
// 输入n
scanf("%d", &n);
// 输出魔方阵
printMagicSquare(n);
return 0;
}
请注意,该程序只能处理1到15之间的n值。如果输入的n值超过15,则需要修改数组大小和相应的逻辑。