打印沙漏

一、题目:

  题目链接

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

  *****
   ***
    *
   ***
  *****

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

  再从小到大顺序递增;首尾符号数相等。给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

 

二、输入格式:

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

 

三、输入样例:

  19 *

 

四、输出样例:

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

 

五、设计思路:

  为了方便叙述,我先假设用户需要打印的符号的个数为N,需要打印的符号是*;

  1,首先我们通过观察该图案,利用等差数列的求和公式可以得到一个规律:第n个图案所包含*的个数为2n2-1个;

  2,然后根据用户输入的N来判断最多可以打印第几个完整图案,例如,如果用户输入19,那么令2n2-1=19,n就约等于3,

    也就是说最多可以打印出第三个图案的所有*;

  3,将我们第二步得到的n代入到2n2-1中,计算出来刚好打印完图案所需要的*的个数,

    也就是说如果用户输入19,那么最多可以打印出第三个图案的所有*,打印该图案所需符号的个数为2*3- 1=17;

  4,最后将用户输入的N减去第三步计算出的2n2-1,可以得到打印完后多出来*的个数,即最后多出符号的个数为:N-(2n2-1),

    如果用户输入19,那么最多可以打印出第三个图案的所有*,打印该图案所需符号的个数为2*3- 1=17,

    最后多出来的*个数为19-17=2;

  5,至于打印出图案的具体代码就是通过三层循环嵌套来实现的,第一层控制打印行数,第二层控制打印控制打印空格数,第三层控制打印符号的个数。

 

六、完整代码:

#include<stdio.h>
#include<math.h>
int main()
{

    int number;
    char ch;
    int n;
    int i,j,k;
    scanf("%d %c",&number,&ch);
    //通过观察我们可以知道第n个图案,需要打印的符号个数为2*n*n-1;
    //2*n*n-1=number ==> n = sqrt((number+1)/2)
    n = sqrt((number+1)/2);
    //判断最后多出来的图案的个数
    int res = number - (2*n*n-1);
    //打印倒三角图案
    //控制打印行数
    for (i = n; i >= 1; i--)
    {
        //控制每行前空格数
        for (k = 1; k <= n-i; k++) {
                printf(" ");
        }
        //控制每图案的个数
        for (j = 1; j <= 2*i-1; j++) {
            printf("%c",ch);
        }
        printf("\n");
    }
   //打印正三角图案
   //控制打印行数
   for (i = 2; i <= n; i++)
    {
        //控制每行前空格数
        for (k = 1; k <= n-i; k++) {
                printf(" ");
        }
        //控制每图案的个数
        for (j = 1; j <= 2*i-1; j++) {
            printf("%c",ch);
        }
        printf("\n");
    }
        printf("%d\n",res);
    // system("pause");
    // getch();
    return 0;
}

 

七、打印效果:

 

 

 

 

posted @ 2020-02-29 11:10  陈太浪  阅读(866)  评论(0编辑  收藏  举报