L1-002. 打印沙漏

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

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

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

输入格式:

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

输出格式:

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

输入样例:
19 *
输出样例:

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

   一开始接触这道题时,其实我内心是有点害怕的,应为以前写这种找规律的题目自己觉的很难,想很久可能都做不出来。但是今天下午自己静下心来尝试后,发现其实还好
吧。我一开始其实是想走捷径,因为题目里说n的取值小于等于1000,所以我想只要把这1000里的所有结果printf出来不就够了吗。事实证明,代码长度超过了,不行。看来只能老老实实找规律。我是先找出题目提供的那组数据的取值的规律,分为上半部分和下半部分,中间的单独部分我是放在了上半部分。然后下半部分看成从第二行开始,也就是i=1,之后先找到输出空格的规律,在找到输出符号的,之后把特殊值用这组图形的行数n来表示出就可以了。我这里是每个n先提前设置好,找好数组的区间范围,然后给出n的值。
#include
#include
int main()
{
    int a,i,j,t,n;
    char b;
    scanf("%d %c",&a,&b);
    if(a>=1&&a<7)
    {
        printf("%c\n%d",b,a-1);
        return 0;
    }
    if(a>=7&&a<17)
    {
        printf("%c%c%c\n %c\n%c%c%c\n%d",b,b,b,b,b,b,b,a-7);
        return 0;
    }
    if(a>=17&&a<31)
        n=5,a=a-17;
    else
    {
        if(a>=31&&a<49)
            n=7,a=a-31;
        else
        {
            if(a>=49&&a<71)
                n=9,a=a-49;
            else
            {
                if(a>=71&&a<97)
                    n=11,a=a-71;
                else
                {
                    if(a>=97&&a<127)
                        n=13,a=a-97;
                    else
                    {
                        if(a>=127&&a<161)
                            n=15,a=a-127;
                        else
                        {
                            if(a>=161&&a<199)
                                n=17,a=a-161;
                            else
                            {
                                if(a>=199&&a<241)
                                    n=19,a=a-199;
                                else
                                {
                                    if(a>=241&&a<287)
                                        n=21,a=a-241;
                                    else
                                    {
                                        if(a>=287&&a<337)
                                            n=23,a=a-287;
                                        else
                                        {
                                            if(a>=337&&a<391)
                                                n=25,a=a-337;
                                            else
                                            {
                                                if(a>=391&&a<449)
                                                    n=27,a=a-391;
                                                else
                                                {
                                                    if(a>=449&&a<511)
                                                        n=29,a=a-449;
                                                    else
                                                    {
                                                        if(a>=511&&a<577)
                                                            n=31,a=a-511;
                                                        else
                                                        {
                                                            if(a>=577&&a<647)
                                                                n=33,a=a-577;
                                                            else
                                                            {
                                                                if(a>=647&&a<721)
                                                                    n=35,a=a-647;
                                                                else
                                                                {
                                                                    if(a>=721&&a<799)
                                                                        n=37,a=a-721;
                                                                    else
                                                                    {
                                                                        if(a>=799&&a<881)
                                                                            n=39,a=a-799;
                                                                        else
                                                                        {
                                                                            if(a>=881&&a<967)
                                                                                n=41,a=a-881;
                                                                            else
                                                                            {
                                                                                if(a>=967&&a<=1000)
                                                                                    n=43,a=a-967;
                                                                            }
                                                                        }
                                                                    }
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    for(i=0;i<((n+1)/2);i++)
    {
        t=i;
        while(t)
            printf(" "),t--;
        for(j=i;j



你可能感兴趣的:(PAT试题)