题目
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