PAT B1027 列印沙漏 20分

2021-10-14 22:14:48 字數 1388 閱讀 9292

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

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

給定任意n個符號,不一定能正好組成乙個沙漏。要求列印出的沙漏能用掉盡可能多的符號。

輸入格式:

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

輸出格式:

首先列印出由給定符號組成的最大的沙漏形狀,最後在一行中輸出剩下沒用掉的符號數。

輸入樣例:

19 *

輸出樣例:

以下是ac的**:

#include

intsandnumber

(int num)

i-=2;

//注意這裡;

return i;

}int

main

(void

)for

(int i=

1;i<=lenm;i++

)printf

("%d"

,left)

;return0;

}

思路:

1,這道題的關鍵在於算出第一行有多少個字元,因為它也是總的行數,我們可以用乙個函式sandnumber(int num)來算出這個數字。我這裡把每每行符號數目看作是2lenm+1;i在正三角中從0,1,2,3……分別對應符號數目的1,3,5,7……。用這個lenm來控制倒三角和正三角的輸出也比較方便。

在sandnumber()這個函式中一定要注意:最後因為多加了4i+2才退出迴圈的,也就是多加了一次,需要減回來;另外i應該從0開始數,但是迴圈中是從1開始的,這裡返回的 i 必須是出迴圈的 i 再減去2。

這裡可以仔細體會一下。

2,另外乙個稍微複雜一點的地方就是算出剩下的數字,我是這樣算的:因為第一行字元數是2*lenm+1,根據累加公式,總的用掉的字元數是:

1+2

*3+2

*5+…… //相當於: 1+

2*(2

*1+1

)+2*

(2*2

+1)+…… //也就是:1+

4*(1

+2+3

+……+i)+2

*i//等於:1+

2*i*

(i+1)+

2*i

這樣我們計算剩下的字元數:

left=total-1-

2*lenm*

(lenm+1)

-2*lenm;

答案的計算方法與這個不同,但是這個方法我覺得還是挺簡單的。

PAT B1027 列印沙漏 20分

1027 列印沙漏 20分 本題要求你寫個程式把給定的符號列印成沙漏的形狀。例如給定17個 要求按下列格式列印 所謂 沙漏形狀 是指每行輸出奇數個符號 各行符號中心對齊 相鄰兩行符號數差2 符號數先從大到小順序遞減到1,再從小到大順序遞增 首尾符號數相等。給定任意n個符號,不一定能正好組成乙個沙漏。...

PAT B1027 列印沙漏 20

題目要求 本題要求你寫個程式把給定的符號列印成沙漏的形狀。例如給定17個 要求按下列格式列印 所謂 沙漏形狀 是指每行輸出奇數個符號 各行符號中心對齊 相鄰兩行符號數差2 符號數先從大到小順序遞減到1,再從小到大順序遞增 首尾符號數相等。給定任意n個符號,不一定能正好組成乙個沙漏。要求列印出的沙漏能...

PAT B1027 列印沙漏(20)

思路 使用陣列儲存每一行沙漏的最大符號數 輸入乙個正整數和乙個符號 遍歷陣列,找到大於正整數的陣列下標 j。三角形底邊的字元數為 j 1 2 1 列印沙漏 列印剩餘字元 x n j 1 ac include const int max n 200 int n max n int i 3 void i...