PAT 乙级 1027

题目

1027 打印沙漏

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

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


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

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

输入格式:

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

输出格式:

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

输入样例:

19 *

输出样例:

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

题解

    本题主要问题有两点:

        1. 对于每行输出字符的循环和判断没有完全搞清楚,导致在4 * 的条件下会输出7个字符,n的结果是-3。

        2. 没有考虑到小于等于0的情况,题目给出的数据范围是(<=1000),因此完全可能存在小于等于0的情况,但是在最初没有考虑。

代码

 1 #include <iostream>
 2 using namespace std;
 3 
 4 int main() {
 5     int n = 0;
 6     char c;
 7     cin >> n >> c;
 8     if (n <= 0) {
 9         return 0;
10     }
11     n--;
12     int low_cnt = 3;
13     while (n > 2 * low_cnt) {
14         if (low_cnt != 1)
15             n -= 2 * low_cnt;
16         else
17             n -= low_cnt;
18         low_cnt += 2;
19     }
20     low_cnt -= 2;
21     int space_cnt = 0;
22     while (low_cnt > 0) {
23         for (int i = 0; i < space_cnt; i++)
24             cout << " ";
25         for (int j = 0; j < low_cnt; j++)
26             cout << c;
27         space_cnt++;
28         low_cnt -= 2;
29         cout << endl;
30     }
31     space_cnt -= 2;
32     low_cnt += 4;
33     while (space_cnt >= 0) {
34         for (int i = 0; i < space_cnt; i++)
35             cout << " ";
36         for (int j = 0; j < low_cnt; j++)
37             cout << c;
38         space_cnt--;
39         low_cnt += 2;
40         cout << endl;
41     }
42     cout << n << endl;
43 
44     return 0;
45 }

题目链接:https://pintia.cn/problem-sets/994805260223102976/problems/994805294251491328

猜你喜欢

转载自www.cnblogs.com/moujun1001/p/9480700.html