链接:http://www.nowcoder.com/pat/6/problem/4053
题目描述
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
*****
***
*
***
*****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递
增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入描述:
输入在一行给出1个正整数N(<=1000)和一个符号,中间以空格分隔。
输出描述:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入例子:
19 *
输出例子:
*****
***
*
***
*****
2
思路:前几天做过一个打印三角形的题目,和这个题目的打印过程差不多。只要先计算好第一行应该有多少个字符就行了。
打印的时候可以设置一个变量来保存当前应该打印的空格的个数。
如 int b=0, t=N, c=N; //b表示应该打印的空格个数 t表示应该打印的字符总个数 c表示应该打印的字符个数
b = t-c;
b /= 2; //因为左右两边各一半空格
注:这个题目还挺搞怪的,让打印沙漏,又不让完整打印
***** //前面空出的地方需要空格,后面就不需要。只打印到字符'*'就可以结束了。如果后面再加空格会提示格式错误。
***
*
***
*****
1 #include "iostream" 2 #include <iomanip> 3 #include <string.h> 4 #include <string> 5 #include <vector> 6 #include <cmath> 7 #include <cctype> 8 #include <algorithm> 9 using namespace std; 10 11 #define COUNT(k) (1+k)*(1+k)/2-1 12 13 int main() 14 { 15 int arr[70]; 16 memset(arr, 0, sizeof(arr)); 17 int n; 18 char ch; 19 cin >>n >>ch; 20 for(int i=1; i<70; ++i) 21 { if(i%2 == 0) continue; 22 arr[i] = COUNT(i); 23 } 24 int t1, t2; 25 for(int i=1; i<70-1; i+=2) 26 { 27 if(i%2 == 0)continue; 28 if(arr[i]<=n && arr[i+2]>n) 29 { 30 t1 = i; 31 t2 = n - arr[i]; 32 break; 33 } 34 } 35 int t3, b; 36 t3 = t1; 37 b = 0; 38 while(t3 >= 1) 39 { 40 b = (t1-t3)/2; 41 for(int i=0; i<b; ++i) cout <<" "; 42 for(int i=0; i<t3; ++i) cout <<ch; 43 //for(int i=0; i<b; ++i) cout <<" "; 44 t3 -= 2; 45 cout <<endl; 46 } 47 t3 = 3; 48 b = 0; 49 while(t3 <= t1) 50 { 51 b = (t1-t3)/2; 52 for(int i=0; i<b; ++i) cout <<" "; 53 for(int i=0; i<t3; ++i) cout <<ch; 54 //for(int i=0; i<b; ++i) cout <<" "; 55 t3 += 2; 56 cout <<endl; 57 } 58 cout <<t2 <<endl; 59 return 0; 60 }