欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-11 19:00:15
...

问题描述

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√

相关标签: PTA乙级