PAT (Basic Level) Practise (中文)-1027. 打印沙漏(20) http://www.patest.cn/contests/pat-b-practise/1027
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
***** *** * *** *****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(<=1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
19 *
输出样例:
***** *** * *** ***** 2
题目分析:
1. 首先要计算第一行显示几个符号可以使形状最大。
2. 输出分为三部分:没有尖儿倒三角、中间一行(只需要输出一遍,所以单独处理)、没有尖儿的正三角
1 #include<stdio.h> 2 int main() 3 { 4 int k=0; 5 char c='0'; 6 scanf("%d",&k); 7 getchar(); 8 scanf("%c",&c); 9 10 int i=0,a=0,sum=0; 11 while(1) 12 { 13 a=2*i+1; 14 if(i && sum+2*a<=k) sum+=2*a; 15 else if( !i && sum+a<=k) sum+=a; 16 else 17 break; 18 i++; 19 } 20 for(int j=i;j>1;j--) 21 { 22 for(int k=0;k<i-j;k++) 23 printf(" "); 24 for(int k=0;k<j*2-1;k++) 25 printf("%c",c); 26 printf(" "); 27 } 28 if(1<=i) 29 { 30 for(int k=0;k<i-1;k++) 31 printf(" "); 32 printf("%c",c); 33 } 34 for(int j=2;j<=i;j++) 35 { 36 printf(" "); 37 for(int k=0;k<i-j;k++) 38 printf(" "); 39 for(int k=0;k<j*2-1;k++) 40 printf("%c",c); 41 } 42 43 if(i) printf(" "); 44 printf("%d",k-sum); 45 return 0; 46 } 47