Blog
It's a Wonderful Life
幻方数组的C语言实现
幻方是一种古老的数学游戏,n阶幻方就是把整数1 ~ ^n排成n*n的方阵,使每行中各元素之和,每列中各元素之和,对角线中各元素之和都相等。
它的算法是首先把1放在最上一行中间的方格中,然后把下一个整数放置到右上方,如果已经处在最上一行,下一个整数就放在最下一行,如果已经处在最右端,就把下一个整数放在最左端。当要放置数的方格已经有数时,就把这个数放在上一个数的正下方。
它的代码实现如下:
#include <stdio.h>
#define MAX 5
int main(void) {
int m, mm, i, j, ni, nj, k;
printf("Please input a number.:-)\n");
scanf_s("%d", &m);
if ((m <= 0) || ((m % 2) == 0)) {
printf("The number has to be greater than zero and be odds:-(\n");
return 1;
}
mm = m * m;
i = 0;
j = m / 2;
int game_pad[MAX][MAX] = { 0 };
for (k = 1; k <= mm; k++) {
game_pad[i][j] = k;
if (i == 0)
ni = m - 1;
else
ni = i - 1;
if (j == (m - 1))
nj = 0;
else
nj = j + 1;
if (game_pad[ni][nj] == 0) {
i = ni;
j = nj;
}
else
i++;
}
for (int out = 0; out < MAX; out++) {
for (int in = 0; in < MAX; in++) {
printf("%2d ", game_pad[out][in]);
}
printf("\n");
}
}
实现过程中的收获:
-
二维数组在定义时(如
list[n][n]
),n必须是个常量值。这个数可以通过#define
来定义。 -
函数
printf()
在输出时可以进行对齐设置。即上例中的%2d(n = 2)
。如果输出内容长度小于n,不足部分填充空格。n为正数时,则在左端补空格,即右对齐。n为负数时,左对齐。如果输出内容长度大于n,则输出全部内容。