PAT (Basic Level) Practise (中文)-1027. 打印沙漏(20)

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("\n");  
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("\n"); 
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("\n");  
44     printf("%d",k-sum);     
45     return 0;
46 }
47  

 

posted on 2015-04-21 18:59  Asin_LZM  阅读(172)  评论(0编辑  收藏  举报