Blog

It's a Wonderful Life

幻方数组的C语言实现

2016-05-11 18:25 Posted in Learn with 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");
 }

}

实现过程中的收获:

  1. 二维数组在定义时(如list[n][n]),n必须是个常量值。这个数可以通过#define来定义。

  2. 函数printf()在输出时可以进行对齐设置。即上例中的%2d(n = 2)。如果输出内容长度小于n,不足部分填充空格。n为正数时,则在左端补空格,即右对齐。n为负数时,左对齐。如果输出内容长度大于n,则输出全部内容。