PAT乙级—1027. 打印沙漏(20)-native

来源:互联网 发布:淘宝可以买男朋友链接 编辑:程序博客网 时间:2024/05/16 11:29

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

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

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

给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

输入格式:

输入在一行给出1个正整数N(<=1000)和一个符号,中间以空格分隔。

输出格式:

首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。

输入样例:
19 *
输出样例:

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

2

思路:此题计算出1000以内可以组成沙漏的符号个数存于a数组,遍历a数组找到第一个>N的元素,则它的前一个元素即为题意要求的沙漏的符号个数,这里有一个规律即组成沙漏的符号个数除以下标即为沙漏的行数,最后分别输出沙漏的上半部分和下半部分

#include<iostream>#include<cstring>using namespace std;int main(){    int N;    int a[50]={0};    char c;    cin>>N>>c;    int temp=1;             int count=1;    while(temp<=1000)   //找出符合沙漏的符号数     {        a[count]=temp;        temp=temp+2*(2*count+1);//符号数有此规律         count++;    }    int left=0,hang=0;    for(int i=1;i<count;i++) //注意为防止除以0,a数组第一个元素为a[1]     {        if(a[i]>N)      //算出行数和剩余的符号数         {            hang=a[i-1]/(i-1);            left=N-a[i-1];            break;        }        else if(i==count-1)//最后一个1000以内的符号数<1000且下一个>1000         {               //1000以内找不到大于N的符号数则就是处理最后一个元素                       hang=a[i]/i;            left=N-a[i];        }    }    for(int i=0;i<hang/2+1;i++) //输出沙漏的上半部分     {        for(int j=0;j<i;j++)//注意两个for循环         {            cout<<" ";        }        for(int j=0;j<hang-2*i;j++)        {            cout<<c;        }        cout<<endl;    }        for(int i=0;i<hang/2;i++)//输出下半部分         {            for(int j=0;j<hang/2-1-i;j++)            {                cout<<" ";            }            for(int j=0;j<2*(i+1)+1;j++)            {                cout<<c;            }        cout<<endl;        }    cout<<left<<endl;    return 0;} 

题目链接:

https://www.patest.cn/contests/pat-b-practise/1027

0 0
原创粉丝点击