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 }
作者:PennyXia
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。