PAT乙级 1027 打印沙漏 (20分)

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

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

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

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

输入格式:

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

输出格式:

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

输入样例:

19 *
 

输出样例:

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



 1 #include <iostream>
 2 #include <cmath>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     int N,n,i;
 8     char c;
 9     cin >> N >> c;
10     n = sqrt(((N+1)/2)*1.0);
11     for(i=n;i>0;i--)
12     {
13         for(int k = 0;k < n-i ; k++) cout << " ";
14         for(int j = 0;j < 2*i-1 ; j++)cout << c ;
15         cout << '\n';
16     }
17     for(int i=2;i<=n;i++)
18     {
19         for(int k=0;k<n-i;k++)  cout << " ";
20         for(int j=0;j<2*i-1;j++)  cout << c ;
21         cout << '\n';
22     }
23     cout << N - (2 * n*n - 1);
24     return 0;
25 }

 

需要注意的是,一开始先把层数n算出来,如果每层的符号数有:
1
3
5
7
9
则我们可以由:
第一层 + 第二层 + 第三层 + 第四层 ... 开根号即可得到层数n

而如果每层的符号数如题目所给:
9
7
5
3
1
3
5
7
9
我们有层数为(注意,此层数为对称的其中一半的层数,而非总层数)
n = sqrt(((N+1)/2)*1.0);    N = 第一层 + 第二层 + 第三层 + 第四层 +...


posted @ 2020-07-08 20:21  ClinDHU  阅读(91)  评论(0)    收藏  举报