打印沙漏


一、題目:

  題目鏈接

  本題要求你寫個程序把給定的符號打印成沙漏的形狀。例如給定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;
}

 

七、打印效果:

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM