C语言实现洛书传说代码:100以内奇数幻方的生成(九宫图的生成)

今天看到一道有意思的C语言题目,与中国传统文化结合起来了

下面是题目展示:

在中国古典文献 中记载了洛书的传说:公元前 23世纪大禹治水之时,一只巨大的神龟出现于黄河支流洛水中,龟甲上有9种花点的图案,分别代表这9个数,而3行、3列以及两对角线上各自的数之和均为15,世人称之为洛书。中国汉朝的数术记遗中,称之为九宫算,又叫九宫图.宋数学家杨辉著《续古摘奇算法 》把类似于九宫图的图形命 名为纵横图,书中列举3、4、5、6、7、8、9、10阶幻方。其中所述三阶幻方构造法:“九子斜排,上下对易,左右相更,四维挺出,戴九履一,左三右七,二四为肩,六八为足”,比法国数学家Claude Gaspar Bachet提出的方法早三百余年。

试编一程序打印九宫图

要求:

输入奇数矩阵大小,比如3,5,9,... ,(<100)

输出矩阵

PS:这里我默认输出格式是"%5d"

直观表述这个表格怎么画

下面是代码展示:

#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");
    }
}

效果就是这样的

这里定义数组的时候,是定义了一个99*99的数组,目的就是为了简便,省去了定义动态数组的麻烦。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

毁我青春

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值