打印沙漏

打印沙漏
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印

*****
***
*
***
*****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。

给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

输入格式:

输入在一行给出1个正整数N(
≤1000)和一个符号,中间以空格分隔。

输出格式:

首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。

输入样例:

19 *
输出样例:

*****
***
*
***
*****
2

 1 #include "stdio.h"
 2 #include "math.h"
 3 int main(int argc, char const *argv[])
 4 {
 5     int m;
 6     char cc;
 7     int i, j, n;
 8     int blank, cnum;//各行左空格数、行字符数
 9     scanf("%d %c", &m, &cc);
10     n = floor(sqrt((m + 1) / 2.0));//最大行数
11     //printf("%d",n);
12     for ( i = n; i > 0 ; --i)
13     {
14         blank = (n - i);
15         cnum = 2 * i - 1;
16         for (j = 0; j < blank; ++j) {//print left blank
17             printf(" ");
18         }
19         for ( j = 0; j < cnum ; ++j)//print string
20         {
21             printf("*");
22         }
23         for (j = 0; j < blank; ++j) {//print right blank
24             printf(" ");
25         }
26         printf("\n");
27     }
28     for ( i = 2; i <= n; ++i)
29     {
30         blank = (n - i);
31         cnum = 2 * i - 1;
32         for (j = 0; j < blank; ++j) {
33             printf(" ");
34         }
35         for ( j = 0; j < cnum ; ++j)
36         {
37             printf("*");
38         }
39         for (j = 0; j < blank; ++j) {
40             printf(" ");
41         }
42         printf("\n");
43     }
44     printf("%d\n", m - n * n * 2 + 1);//print over number
45     return 0;
46 }

 

posted @ 2016-07-19 14:29  ChihyunLing  阅读(207)  评论(0)    收藏  举报