B1027打印沙漏

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

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

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

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

输入格式:

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

输出格式:

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

输入样例:

19 *
 

输出样例:

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

思路:

•先划分三部分(往上扩展部分、中间一行、往下扩展部分)进行打印,在每个部分理清变量和打印符号或者空格的关系:

•用row表示从第一行向外扩展的行数,i表示第几层,根据row确定空格个数row-i,打印字符个数根据层数等差数列求an

问题:

测试点1答案错误,输入:1 * ,发生错误。

解决:

边界问题,考虑最小边界。row初值不确定,因为在下面的循环中只能执行i=0,但是不满足if判断,所以此时row仍是不确定的值,所以发生错误,需要将row初始化为0。或将循环边界改成i<=n。

 

 1 #include <iostream>
 2 using namespace std;
 3 int main() {
 4     int n,row;//row是从第一行向外扩展的行数
 5     char c;
 6     cin >> n >> c;
 7     for (int i = 0; i <= n; i++) {
 8         if (2*i*i + 4 * i + 1 > n)
 9         {
10             row = i - 1;
11             break;
12         }
13     }
14     for (int i = row; i >= 1; i--) {
15         for (int j = 1; j <= row - i; j++)cout << " ";
16         for (int k = 1; k <= 2 * i + 1; k++)cout << c;
17         cout << endl;
18     }
19     for (int i = 1; i <= row; i++)cout << " ";
20     cout << c << endl;
21     for (int i = 1; i <= row; i++) {
22         for (int j = 1; j <= row - i; j++)cout << " ";
23         for (int k = 1; k <= 2 * i + 1; k++)cout << c;
24         cout << endl;
25     }
26     cout << (n - (2 * row*row + 4 * row + 1));
27     return 0;
28 }

 

posted @ 2020-02-10 12:38  PennyXia  阅读(157)  评论(0编辑  收藏  举报