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 = 第一层 + 第二层 + 第三层 + 第四层 +...

浙公网安备 33010602011771号