今天看到一道有意思的C语言题目,与中国传统文化结合起来了
下面是题目展示:
在中国古典文献 中记载了洛书的传说:公元前 23世纪大禹治水之时,一只巨大的神龟出现于黄河支流洛水中,龟甲上有9种花点的图案,分别代表这9个数,而3行、3列以及两对角线上各自的数之和均为15,世人称之为洛书。中国汉朝的数术记遗中,称之为九宫算,又叫九宫图.宋数学家杨辉著《续古摘奇算法 》把类似于九宫图的图形命 名为纵横图,书中列举3、4、5、6、7、8、9、10阶幻方。其中所述三阶幻方构造法:“九子斜排,上下对易,左右相更,四维挺出,戴九履一,左三右七,二四为肩,六八为足”,比法国数学家Claude Gaspar Bachet提出的方法早三百余年。
试编一程序打印九宫图
要求:
输入奇数矩阵大小,比如3,5,9,... ,(<100)
输出矩阵
PS:这里我默认输出格式是"%5d"
![](https://i-blog.csdnimg.cn/blog_migrate/7ad4215ec2978d0f0caa565d9c2bd300.png)
直观表述这个表格怎么画
下面是代码展示:
#include<stdio.h>
#define LEN 99
void CMS(int mag[LEN][LEN], int odd);
void printMag(int mag[LEN][LEN], int odd);
int main()
{
int odd;
int mag[LEN][LEN] = {0};//将数组都初始化为0,不仅是好习惯,而且在之后有用处
scanf("%d",&odd); //输入一个奇数,作为矩阵的阶数
CMS(mag,odd);
printMag(mag,odd);
return 0;
}
//函数功能:生成“九宫图”
//传递参数:二维数组,矩阵阶数
void CMS(int mag[LEN][LEN], int odd)
{
int i, row = odd-1, col = odd / 2, mul = odd * odd;
for(i = 1; i <= mul;) //1到odd*odd遍历
{
//判断该位置是否被占
if(mag[row][col] != 0)
{
//如果被占了,则向上两格,向左一格,回到原来数字的正上方
row = row - 2;
--col;
//如果向上顶到头了,就放最后一排
if(row >= odd)
row = row - odd;
continue; //重新开始循环
}
mag[row][col] = i; //赋值
//计算下一个位置的row、col
++row;
++col;
//考虑在右下角的情况
if(row >= odd && col >= odd)
{
row = row -2;
--col;
}
//不在右下角
else
{
if(row >= odd)
row = row - odd;
if(col >= odd)
col = col - odd;
}
++i; //i自增
}
}
//打印函数
void printMag(int mag[LEN][LEN], int odd)
{
int i,j;
for(i = 0; i < odd; i++)
{
for(j = 0; j < odd; j++)
{
printf("%5d",mag[i][j]);
}
printf("\n");
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/e6c514b8e023f085e0ae1212db3d410b.png)
效果就是这样的
这里定义数组的时候,是定义了一个99*99的数组,目的就是为了简便,省去了定义动态数组的麻烦。