打印图形(沙漏与菱形)

打印沙漏

题目描述
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印

  *****
   ***
    *
   ***
  *****

所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递
增;首尾符号数相等。

给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入
输入在一行给出1个正整数N(N<=1e5)和一个符号,中间以空格分隔。
输出
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
样例输入
19 *
样例输出

*****
 ***
  *
 ***
*****
2

题目分析

  • 题目不仅要输出沙漏,还要输出剩余字符的数量
  • 首先我们减去中间字符的数量,因为除了中间字符以外都是对称的关系,而且从中间层往外是字符为3个的行,题目要求尽可能多的输出,所以我们可以由内往外判断,如果满足那就减去相应的字符,那么剩下来的就是不能组成新的一行的字符数量,我们在代码最后输出就行
  • 现在来看看沙漏的形状,第一行是没有空格的,那我们就按照题目意思模拟一下就行,我们把沙漏分为上三角与下三角分别打印,因为打印完上三角之后now的值就是1了,之后我们就打印下三角就行。
#include <bits/stdc++.h>
using namespace std;
int main()
{
   
    int n;
    char c;
    while (~scanf("%d %c", &n, &c))
    {
   
        int m = n - 1, now = 3; //判断
        while (m >= now * 2)
        {
   
            m -= now * 2;
            now += 2;
        }
        now -= 2; //第一行的字符号
        int blank = 0, sum = now;
        //打印上三角
        // cout<<now<<endl;
        while (now > 1)
        {
   
            //cout<<now<<endl;
            for (int i = 1; i <= blank; ++i)
                printf(" ");
            for (int i = 1; i <= now; ++i)
                printf("%c", c);
            printf("\n");
            ++blank;
            now -= 2;
        }
        // cout<<now<<endl;
        // 打印下三角
        while (now <= sum)
        {
   
            for (int i = 1; i <= blank; ++i)
                printf(" ");
            for (int i = 1; i <= now; ++i)
                printf("%c", c);
            printf("\n");
            --blank;
            now += 2;
        }
        printf("%d\n", m);
    }
    return 0;
}

菱形图案

题目描述
KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“”组成的菱形图案。
输入
多组输入,一个整数(2~20)。
输出
针对每行输入,输出用“
”组成的菱形,每个“*”后面有一个空格。每输出一个菱形的后面需要空一行。
样例输入

2
3
4

样例输出

  * 
 * * 
* * * 
 * * 
  * 

   * 
  * * 
 * * * 
* * * * 
 * * * 
  * * 
   * 

    * 
   * * 
  * * * 
 * * * * 
* * * * * 
 * * * * 
  * * * 
   * * 
    * 

直接模拟输出~

#include <bits/stdc++.h>
using namespace std;
int main()
{
   
    int n;
    while (~scanf("%d", &n))
    {
   
        for (int i = n; i >= 0; --i)
        {
   
            for (int j = i; j >= 1; --j)
                printf(" ");
            for (int k = i; k <= n; ++k)
                printf("* ");
            printf("\n");
        }
        for (int i = 1; i <= n; ++i)
        {
   
            for (int j = i; j >= 1; --j)
                printf(" ");
            for (int k = i; k <= n; ++k)
                printf("* ");
            printf("\n");
        }
        printf("\n");
    }
    return 0;
}

大佬的代码

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 1e5 + 5;
int main()
{
   
    int n;
    while (~scanf("%d", &n))
    {
   
        for (int i = n; i >= 0; --i)
        {
   
            for (int j = 1; j <= i; ++j)
                putchar(' ');
            for (int j = i; j <= n; ++j)
                printf("* ");
            putchar('\n');
        }
        for (int i = 1; i <= n; ++i)
        {
   
            for (int j = 1; j <= i; ++j)
                putchar(' ');
            for (int j = i; j <= n; ++j)
                printf("* ");
            putchar('\n');
        }
        putchar('\n');
    }
    return 0;
}
生活不会怠慢一个热爱它的人,上紧你的发条,滴滴答答的转起来就好了~

全部评论

相关推荐

来个offer吧求求求了:这个问题涉及到底层原理,可能需要+v详细探讨
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务