PTA刷题Basic篇——1027.打印沙漏——Day(14)

问题描述

在这里插入图片描述
根据给定的整数,打印具有题目要求的结构,且必须要对称。多余的数字在最后一行输出。

题目分析

根据给定的整数,我们可以计算出打印沙漏的上半部分的行数。通过数学归纳的方法,我们可以得出规律,沙漏的上半部分高度为:sqrt((n+1) / 2

`我们先输出上半部分,再输出下半部分。我们发现在第三行时,一共有5个字符,在第二行有3个字符,所以对于第h行字符数应该是:

2 * h - 1 ///第h行的字符数目

这将是我们打印上半部分的内层迭代。我们还可以看到,每一行除了最后一行和第一行,每一行要打印空格,第三层不用打印空格,第二层打印1个空格,第一层打印两个空格,因此打印空格数应该是上半部分高度-当前层数。
在打印下半部分时,这个规律要反向,因为我们先打印数目较多的空格,再打印数目少的,层数可以看作反向的层数,即从第一层到第h层的顺序遍历。而上半部分是从第h层向第一层遍历。

代码

#include <iostream>
#include <math.h>
using namespace std;
int main()
{
    int n;
    char a;
    while(cin>>n>>a)//保证多组数据输入
    {
        int h;
        h=sqrt((n+1)/2);//计算上半部分有多少行
        int c=0;
        for(int i=h;i>0;i--)
         {
            for(int j=1;j<=h-i;j++)
            {
                cout<<" ";//打印空格
            }
            for(int j=2*i-1;j>=1;j--)
            {
                cout<<a;//打印字符
            }
                cout<<endl;//打印回车
        }
        for(int i=2;i<=h;i++)//从第二个开始打印
        {
            for(int j=h-i;j>=1;j--)
            {
                cout<<" ";//打印空格
            }
            for(int j=1;j<=2*i-1;j++)
            {
                cout<<a;
            }
            cout<<endl;
        }
        c=(n-(2*h*h-1));
        cout<<c;
    }
    return 0;
}

答题用时14min
Q27——finish√

发布了60 篇原创文章 · 获赞 2 · 访问量 1036

猜你喜欢

转载自blog.csdn.net/weixin_44755413/article/details/105654926