C语言实现奇数阶幻方生成算法

本文介绍如何使用C语言实现奇数阶幻方的生成。

什么是幻方?

幻方是一个 n x n 的矩阵,其中填充了从 1 到 n^2 的整数,且每行、每列以及两条对角线上的数字之和都相等。

Glaisher 算法

Glaisher 算法是一种生成奇数阶幻方的算法。其步骤如下:

  1. 将数字 1 放置在第一行的中间列。
  2. 将后续数字依次放置在当前数字的右上方位置。
  3. 如果右上方位置已超出矩阵边界,则根据以下规则进行调整:
    • 如果超出上边界,则放置到该列的最下方。
    • 如果超出右边界,则放置到该行的最左侧。
    • 如果右上方位置已有数字,则放置到当前数字的正下方。

C语言代码

#include <stdio.h>
#include <stdbool.h>

void generateMagicSquare(int n, int magicSquare[n][n]) {
    int row = 0;
    int col = n / 2;

    for (int num = 1; num <= n * n; num++) {
        magicSquare[row][col] = num;

        row--;
        col++;

        if (num % n == 0) {
            row += 2;
            col--;
        } else {
            if (row < 0) {
                row = n - 1;
            }
            if (col == n) {
                col = 0;
            }
        }
    }
}

void printMagicSquare(int n, int magicSquare[n][n]) {
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf('%4d', magicSquare[i][j]);
        }
        printf('
');
    }
}

int main() {
    int n;

    printf('请输入一个奇数阶数(例如,3,5,7):');
    scanf('%d', &n);

    if (n % 2 != 1 || n < 3 || n > 19) {
        printf('输入错误,请输入一个3到19之间的奇数。
');
        return 1;
    }

    int magicSquare[n][n];

    generateMagicSquare(n, magicSquare);
    printMagicSquare(n, magicSquare);

    return 0;
}

代码解释

  • generateMagicSquare 函数根据 Glaisher 算法生成幻方。
  • printMagicSquare 函数打印生成的幻方。
  • main 函数处理用户输入,调用 generateMagicSquare 生成幻方,并调用 printMagicSquare 打印幻方。

示例

如果输入阶数为 5,则程序将输出以下 5x5 幻方:

  17   24    1    8   15
  23    5    7   14   16
   4    6   13   20   22
  10   12   19   21    3
  11   18   25    2    9

总结

本文介绍了使用 Glaisher 算法生成奇数阶幻方的 C 语言实现。该算法简单易懂,代码简洁易读,适合初学者学习。

C语言实现奇数阶幻方生成算法

原文地址: https://www.cveoy.top/t/topic/UXL 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录