牛客网刷题 | BC106 K形图案

目前主要分为三个专栏,后续还会添加:

        专栏如下:                 C语言刷题解析       C语言系列文章       我的成长经历

感谢阅读!

初来乍到,如有错误请指出,感谢!


描述

KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的K形图案。

输入描述:

多组输入,一个整数(2~20)。

输出描述:

针对每行输入,输出用“*”组成的K形,每个“*”后面有一个空格。

 


思路 :

由输出可以看出 这由一个正着直角三角形和一个倒立的直角三角形组成

也可以分成两部分 上面一部分 下面一部分


  1. 理解K形图案:K形图案是一个中心对称的图案,从上到下,每行的星号数量逐渐增加,直到中间行,然后每行的星号数量逐渐减少,回到第一行。

  2. 确定行数:输入的整数n决定了K形图案的行数。如果n是奇数,那么中间行就是第(n+1)/2行;如果n是偶数,中间行是n/2n/2 + 1行。

  3. 打印图案

    • 增加星号:从第1行开始,每行打印相应数量的星号,直到中间行。如果n是奇数,中间行有(n+1)/2个星号;如果n是偶数,中间两行各有n/2个星号。
    • 打印空格:每打印一个星号后,打印一个空格。
    • 减少星号:从中间行之后,每行的星号数量逐渐减少,直到第1行。如果n是奇数,从(n+3)/2行开始减少;如果n是偶数,从n/2 + 2行开始减少。
  4. 处理边界情况:当n=2时,图案是对称的,需要特别处理。这种情况下,第一行和第二行有1个星号,第三行和第四行有2个星号。

  5. 实现逻辑

    • 使用一个循环来控制行数,从1到n
    • 在每一行,首先确定该行应该有多少个星号。这可以通过计算当前行数与中间行数的关系来实现。
    • 然后,使用另一个循环来实际打印星号和空格。
    • 最后,每打印完一行后,打印一个换行符以开始新的一行。

代码 1:

#define _CRT_SECURE_NO_WARNINGS

/*由输出可以看出 这由一个正着直角三角形和一个倒立的直角三角形组成
也可以分成两部分 上面一部分 下面一部分
*/

# include <stdio.h>
int main()

{
    int n = 0;
    while (scanf("%d", &n) != EOF)
    {
        int i = 0;

        //上半部分
        //控制每行的打印
        for (i = 0; i < n; i++)//这里是n行  下半部分就是n+1行
        {
            //上半部分 倒立的直角三角形
            //一个星号和一个空格
            int j = 0;
            for (j = 0; j < n+1-i; j++)
            //n+1-i 的意思就是按照题目的意思来打印星号和空格
            //当我们输入4的时候
            //总共的打印是n+1个 当打印第一行的时候 i就是0 就打印n+1就可以了
            //第二行的时候 i就是1 打印n就可以了
            //第三行的时候 i就是2 打印n-1个就可以了
            //因为i是小于n的 当i为3 的时候 i<4成立 继续打印
            //然后i为4的时候 条件不成立 退出循环 打印换行符 就行下半部分的打印
            {
                printf("* ");//按照题目的格式来输出
            }
            printf("\n");

        }
        //下半部分
        for (i = 0; i < n+1; i++)//n+1行
        {
            int j = 0;
            for (j = 0; j <= i; j++)//i是从0开始计算的 每次累积
            //i是1的时候打印一个星号和空格 是2的时候打印两个 是3的时候打印三个......
            {
                printf("* ");
            }
            printf("\n");
        }

    }
    return 0;
}

 代码 2 :

// 打印*号的方法
void printXuqiu(int count) // 定义一个函数printXuqiu,用于打印K形图案的上半部分
{
    for (int i = 0; i <= count; ++i) // 循环从0到count(包括count),控制打印的行数
    {
        printf("* "); // 打印一个星号和一个空格
        if (i == count) // 当打印到上半部分的最后一行时
        {
            printf("\n"); // 打印一个换行符,结束当前行
            printXuqiu(--count); // 递归调用printXuqiu函数,打印下半部分,count减1
        }
    }
}

// 打印下半部分*号的方法
void printXiaBan(int count) // 定义一个函数printXiaBan,用于打印K形图案的下半部分
{
    int num = 2; // 初始化变量num为2,用于控制每行打印的星号数量
    for (int i = 1; i <= count; ++i) // 循环从1到count,控制打印的行数
    {
        for (int j = 0; j < num; ++j) // 内层循环,打印当前行的星号
        {
            printf("* "); // 打印一个星号和一个空格
        }
        if (num <= count) // 当当前行不是最后一行时
        {
            printf("\n"); // 打印一个换行符,结束当前行
            num++; // 增加num的值,以便下一行打印更多的星号
        }
    }
}

int main() // 定义主函数
{
    int count = 0; // 定义一个整型变量count,用于存储用户输入的行数
    scanf("%d", &count); // 读取用户输入的行数
    if (count >= 2 && count <= 20) // 检查输入的行数是否在2到20之间
    {
        printXuqiu(count); // 调用printXuqiu函数,打印K形图案的上半部分
        printXiaBan(count); // 调用printXiaBan函数,打印K形图案的下半部分
    }
}

 

  

  • 19
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值