生成代码(实现奇数阶幻方。在一个由若干个排列整齐的数组成的正方形中,图中任意一横行、一纵行的几个数之和都相等,具有这种性质的图表,称为“幻方”。按目前填写幻方的方法,是把幻方分成了三类,即奇数阶幻方、双偶阶幻方、单偶阶幻方。奇数阶幻方的方法比较简单,这里只考查奇数阶幻方的程序。输入30以内的任一奇数n,自动输出n*n阶幻方。)
时间: 2024-02-12 19:04:59 浏览: 138
奇数阶幻方生成器
以下是实现n阶幻方的代码,其中n为奇数:
```
#include <stdio.h>
#define MAX_N 30
int magic[MAX_N][MAX_N]; // 储存幻方的数组
void generate_magic(int n)
{
int row, col, i, j, num;
// 初始化数组
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
magic[i][j] = 0;
}
}
// 第一个数放在第一行中间
row = 0;
col = n / 2;
magic[row][col] = 1;
// 依次填充剩下的数
for (num = 2; num <= n * n; num++) {
// 计算下一个数的位置
i = row;
j = col;
if (i == 0) {
i = n - 1;
} else {
i--;
}
if (j == n - 1) {
j = 0;
} else {
j++;
}
// 如果下一个位置已经有数了,则下一个数放在当前数的下方
if (magic[i][j] != 0) {
i = row + 1;
j = col;
}
// 填充下一个数
magic[i][j] = num;
row = i;
col = j;
}
}
void print_magic(int n)
{
int i, j;
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
printf("%4d", magic[i][j]);
}
printf("\n");
}
}
int main()
{
int n;
printf("请输入n(n为奇数且不大于30):");
scanf("%d", &n);
if (n % 2 == 0) {
printf("n必须是奇数!\n");
return 0;
}
generate_magic(n);
print_magic(n);
return 0;
}
```
该程序使用一个二维数组magic来存储幻方,其中magic[i][j]表示幻方中第i行第j列的数。程序首先读入n,如果n不是奇数,则输出错误信息并结束程序。接着,程序调用generate_magic函数生成n阶幻方,并调用print_magic函数输出幻方。在generate_magic函数中,程序首先初始化数组,然后将第一个数放在第一行中间。接着,程序依次填充剩下的数。程序计算下一个数的位置,如果下一个位置已经有数了,则下一个数放在当前数的下方。最后,程序填充下一个数,然后更新行列号。在print_magic函数中,程序使用双重循环输出幻方中的数。
阅读全文