打印圣诞树

yizhihongxing

打印圣诞树

今天遇到一个不算特别变态的题目,可是却往错误的方向思考了有一会儿。

这是这个题目的链接:[打印圣诞树](圣诞树_牛客题霸_牛客网 (nowcoder.com))

题目大致意思是,给定一个高度,打印出圣诞树。

效果图类似以下这种:

打印圣诞树

错误示范

首先我把每片叶子看作是5X3的矩形,空白看作是3X3的矩形

最上面为第1层,最下面为第n层。

第i层前面有n-i个空矩形。

打印圣诞树

于是,我就想到了下面的代码:

#include"stdio.h"
void print_empty();//打印空矩形,只含一个printf函数
void print_53();//打印三角矩形,只含一个printf函数
int main()
{
    int n=0;
    scanf("%d",&n);//n是输入的圣诞树高度
    for(int i=1;i<n+1;i++)//到第i层
    {
        for(int j=0;j<n-i;j++)//第i层有n-i个空矩形
            print_empty();
        for(int j=0;j<i;j++)//第i层有i个53矩形
            print_53();
        printf("\n");
    }
    return 0;
}
void print_empty()
{
    printf("   \n"
           "   \n"
           "   \n");
}
void print_53()
{
    printf("  *  \n"
           " * * \n"
           "* * *\n");
}

突然我想到,在打印空矩形和53矩形时换了行,我要怎么保证两个矩形在同一行呢?

果不其然,结果成了这样。

打印圣诞树

而且,这种方式还有一个缺点,就是两个53矩形之间还有一行没考虑,自然更不可能得到正确答案。

正确姿势

代码

直接上代码,再解释:

#include <stdio.h>
void print_empty_3();//输出3个空格
void print_level(int l);//打印矩形第l行
int main()
{
    //不妨把圣诞树的每片三角形看作是 6X3 的矩形
    //把矩形看作一个元素,那么从上到下,共n层,从第一层开始看
    //第i层先有空白矩形n-i个,有三角形矩形i个

    //这样在每层的内部,还有三行,从上到下3行,从第一行开始看
    //第j行先有空白矩形行(n-i)个,之后有i个第j行矩形
    int n=0;
    scanf("%d",&n);
    for (int i = 1; i < n+1; ++i)//控制第几层
    {
        for (int j = 1; j <=3; ++j)//到了第i层的第j行,控制行
        {
            for (int k = 0; k < n-i; ++k) //第j行先有空白
            {
                print_empty_3();
            }
            for (int k = 0; k < i; ++k) //打印i个矩形第j行
            {
                print_level(j);
            }
            printf("\n");//每行输出完后换行
        }
    }
    //最后,还有一个高n行的树根
    //这个树根的位置在第nX3列
    for (int i = 0; i < n; ++i)//控制树根高度为n
    {
        for (int j = 0; j < n*3-1; ++j)
        {
            printf(" ");
        }
        printf("*\n");
    }
}
void print_empty_3()
{
    printf("   ");
}
void print_level(int l)
{
    if (1==l)
        printf("  *   ");
    else if(2==l)
        printf(" * *  ");
    else if(3==l)
        printf("* * * ");
}

解释

打印圣诞树

这个版本中,我将圣诞树的每片三角形看作是6X3的矩形,用以解决5X3矩形时两个矩形中间有缺口的问题

,并且把每层矩形再分为3行。

思路

树叶思路

从第一层开始从上往下共n层,第i层先有(n-i)个空矩形,i个六三矩形

每一层从第一行开始从上往下共3行,每行先打印(n-i)个单行空矩形,也就是(n-i)*3个空格

在打印第j行的单行矩形,这里用 void print_level(int l),函数接收第几行,就打印六三矩形的第几行,

一行打印完不忘换行 printf("\n");

树根思路

至于最后的树根,这个很简单,找规律即可:

当n=1时,树根长1,在占用行的第3个字符处;

当n=2时,树根长2,在占用行的第6个字符处;

当n=3时,树根长3,在占用行的第9个字符处;

所以,树根长n,在占用行的第n*3个字符处;

所以,来一个嵌套循环即可:

外层循环控制行,内层循环控制空格字符数,到n*3的位置时停止打印空格,打印“*”。

    for (int i = 0; i < n; ++i)//控制树根高度为n
    {
        for (int j = 0; j < n*3-1; ++j)
        {
            printf(" ");
        }
        printf("*\n");
    }

最终效果

打印圣诞树

原文链接:https://www.cnblogs.com/saopigqwq233/p/17311467.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:打印圣诞树 - Python技术站

(0)
上一篇 2023年4月17日
下一篇 2023年4月17日

相关文章

  • FTP客户端c代码功能实现

      现在市面上有很多免费的FTP软件:如FileZilla ,那如果想自己在代码中实现与ftp服务器的上传下载文件该如何实现那?  本质上ftp协议就是TCP基础上建立的一种协议,具体如下。 FTP 概述 文件传输协议(FTP)作为网络共享文件的传输协议,在网络应用软件中具有广泛的应用。FTP的目标是提高文件的共享性和可靠高效地传送数据。 在传输文件时,FT…

    C语言 2023年4月18日
    00
  • C语言 strcpy()函数

    当我们需要对一个字符串进行复制的时候,可以使用C语言中的strcpy()函数。本文将详细介绍strcpy()函数的使用方法,并包含两个示例来帮助读者更好地了解其使用。 函数说明 strcpy()函数的原型如下: char *strcpy(char *dest, const char *src); 该函数的功能是将源字符串(src)复制到目标字符串(dest)…

    C 2023年5月9日
    00
  • C/C++从零开始的cmake教程

    下面是C/C++从零开始的CMake教程的完整攻略: 1 概述 CMake是一个非常流行的跨平台的构建系统,它能够自动生成Makefile或者Visual Studio等工具所需要的工程文件。 相信大家对Makefile都不陌生,如果要手动写Makefile,需要一定的经验和技巧,很容易出错,而且维护成本比较高。 而CMake则是一个更加高级的工具,它的语法…

    C 2023年5月23日
    00
  • C#实现json格式数据解析功能的方法详解

    C#实现json格式数据解析功能的方法详解 什么是JSON JSON(JavaScript Object Notation,JavaScript对象表示法),是一种轻量级的数据交换格式。JSON文本以纯文本方式表示,并且可以被多种编程语言解析和生成。 JSON由两种数据结构组成: 键值对集合,用于表示对象或复杂数据结构。 值列表,用于表示数组或简单数据结构。…

    C 2023年5月23日
    00
  • 电脑蓝屏代码0xc0000225怎么解决? 电脑0xc0000225错误的解决办法

    电脑蓝屏代码0xc0000225怎么解决 在使用电脑的过程中,可能会遇到蓝屏错误代码0xc0000225,导致电脑无法正常使用。本文将为您介绍该错误的原因,并提供解决该错误的相关方法。 错误原因 出现0xc0000225错误意味着启动程序无法正确加载winload.efi文件。通常情况下,这种问题可能是由以下原因引起的: 应用项损坏 启动数据损坏 硬件故障(…

    C 2023年5月23日
    00
  • C/C++语言printf命令使用方法

    C/C++语言printf命令使用方法 一、printf命令的作用 printf命令是C语言和C++语言中的一个常用的输出函数,用于将指定的文字、字符、数字等信息输出到屏幕上。其语法为: printf("格式化字符串", 输出参数); 其中,格式化字符串是一个包含格式控制字符和普通字符的字符串,控制字符串中使用%占位符表示需要输出的变量的…

    C 2023年5月23日
    00
  • 深入了解C++异常处理

    深入了解C++异常处理 C++异常处理是一种处理程序错误的机制,在代码出现错误时,以一种标准化的方式抛出异常,传递异常信息,然后可以选择在程序的其他部分捕获并处理它们,以便程序可以以一种优雅的方式退出或恢复。在这篇文章中,我们将介绍C++异常处理的基本概念,并提供示例来解释异常的情况。 异常处理的三个基本部分 C++异常处理的三个基本部分是:抛出异常、捕获异…

    C 2023年5月22日
    00
  • vscode 配置 C/C++编译环境(完整教程)

    下面是“vscode配置C/C++编译环境(完整教程)”的完整攻略: 一、安装vscode和MinGW-w64 1.安装vscode vscode是一款非常流行的编辑器,使用非常方便,可以在官网 https://code.visualstudio.com/ 下载最新版的安装包进行安装。安装完成后,打开vscode,在左侧菜单栏中搜索并安装“C/C++”插件。…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部