打印沙漏

打印沙漏

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

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

所謂“沙漏形狀”,是指每行輸出奇數個符號;各行符號中心對齊;相鄰兩行符號數差2;符號數先從大到小順序遞減到1,再從小到大順序遞增;首尾符號數相等。

給定任意N個符號,不一定能正好組成一個沙漏。要求打印出的沙漏能用掉儘可能多的符號。

輸入格式:
輸入在一行給出1個正整數N(≤1000)和一個符號,中間以空格分隔。
輸出格式:
首先打印出由給定符號組成的最大的沙漏形狀,最後在一行中輸出剩下沒用掉的符號數。
輸入樣例:
19 *
輸出樣例:

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

2


思路:

1、確定n對應可打印的沙漏行數。設置參數sum爲沙漏中*的總數,i表示沙漏擴展的層數,則有sum=2*i*(i+2)+1,將sum和n進行比較,當sum>n時跳出循環。設row表示最終輸出的沙漏的除最中間行外上/下部分的層數,因sum不可超過n且跳出循環前仍需執行一次i++操作,故row=i-2。
2、打印沙漏。分爲上下兩部分打印。對於中間行向外擴展的第j行而言,首先打印row-j個空格,之後打印2j+1個字符;中間行可做j=0處理。


代碼:

#include <stdio.h>
int main()
{
    int n,i=0,sum=0,row;
    char c;
    scanf("%d %c",&n,&c);
    while(sum<=n){
      sum=2*i*(i+2)+1;
      i++;
    }
    row = i-2;

    for(int j=row;j>=0;j--){
        for(int k=0;k<row-j;k++){
            printf(" ");
        }
        for(int k=row-j;k<row+j+1;k++){
            printf("%c",c);
        }
        printf("\n");
    }

    for(int j=1;j<=row;j++){
        for(int k=0;k<row-j;k++){
            printf(" ");
        }
        for(int k=row-j;k<row+j+1;k++){
            printf("%c",c);
        }
        printf("\n");
    }

    printf("%d\n",n-2*row*(row+2)-1);

}


出現的錯誤

1、第一次寫程序時未設置sum的初值,導致n取16以下時無法進行進入while循環,17以上則可進入,未想明白原因,可能原因是sum隨機賦值的初值大於16?

發佈了17 篇原創文章 · 獲贊 2 · 訪問量 9813
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章