打印沙漏 (PATB-1027)

题面

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

1*****
2 ***
3  *
4 ***
5*****

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

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

输入

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

输出

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

样例输入

119 *

样例输出

1*****
2 ***
3  *
4 ***
5*****
62

提示

思路

代码

 1int main()
 2{
 3    int n; char c;
 4    scanf("%d %c", &n, &c);
 5
 6    int x, num=0;
 7    for(x=1; ; x++)
 8    {
 9        if(n < 2*x*x-1)
10        {
11            x--;
12            num = 2*x*x-1;
13            break;
14        }
15    }
16    int flag = 1, m = 2*x-1;
17    int a = 0, b = m;
18
19    for(int i=1; i<=m; i++)
20    {
21        for(int j=0; j<a; j++) printf(" ");
22        for(int j=0; j<b; j++) printf("%c", c);
23        printf("\n");
24        if(i==x) flag = 0;
25
26        if(flag)
27            a++, b-=2;
28        else
29            a--, b+=2;
30    }
31    printf("%d\n", n-num);
32
33    return 0;
34}