打印沙漏

1、題目:

  本題要求你寫個程序把給定的符號打印成沙漏的形狀。例如給定17個「*」,要求按下列格式打印html

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

  所謂「沙漏形狀」,是指每行輸出奇數個符號;各行符號中心對齊;相鄰兩行符號數差2;符號數先從大到小順序遞減到1,markdown

  再從小到大順序遞增;首尾符號數相等。給定任意N個符號,不必定能正好組成一個沙漏。要求打印出的沙漏能用掉儘量多的符號。spa

 

2、輸入格式:

  輸入在一行給出1個正整數N(≤1000)和一個符號,中間以空格分隔。設計

 

3、輸入樣例:

  19 *code

 

4、輸出樣例:

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

 

5、設計思路:

  爲了方便敘述,我先假設用戶須要打印的符號的個數爲N,須要打印的符號是*;htm

  1,首先咱們經過觀察該圖案,利用等差數列的求和公式能夠獲得一個規律:第n個圖案所包含*的個數爲2n2-1個;blog

  2,而後根據用戶輸入的N來判斷最多能夠打印第幾個完整圖案,例如,若是用戶輸入19,那麼令2n2-1=19,n就約等於3,get

    也就是說最多能夠打印出第三個圖案的全部*;io

  3,將咱們第二步獲得的n代入到2n2-1中,計算出來恰好打印完圖案所須要的*的個數,class

    也就是說若是用戶輸入19,那麼最多能夠打印出第三個圖案的全部*,打印該圖案所需符號的個數爲2*3- 1=17;

  4,最後將用戶輸入的N減去第三步計算出的2n2-1,能夠獲得打印完後多出來*的個數,即最後多出符號的個數爲:N-(2n2-1),

    若是用戶輸入19,那麼最多能夠打印出第三個圖案的全部*,打印該圖案所需符號的個數爲2*3- 1=17,

    最後多出來的*個數爲19-17=2;

  5,至於打印出圖案的具體代碼就是經過三層循環嵌套來實現的,第一層控制打印行數,第二層控制打印控制打印空格數,第三層控制打印符號的個數。

 

6、完整代碼:

#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;
}

 

7、打印效果:

相關文章
相關標籤/搜索