PAT 乙 1027 列印沙漏 20 分

2021-10-19 13:38:37 字數 2419 閱讀 7934

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

∗∗∗

∗∗*****

∗∗∗∗∗∗∗∗

***∗∗∗∗*

∗∗∗∗***

∗∗∗∗∗∗

∗∗*****

∗∗∗∗

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

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

輸入樣例:

19 *

輸出樣例:

∗∗∗

∗∗*****

∗∗∗∗∗∗∗∗

***∗∗∗∗*

∗∗∗∗***

∗∗∗∗∗∗

∗∗*****

∗∗∗∗∗2

列印沙漏是關於等差數列的題。該等差數列是乙個首項a1=

1a_1=1

a1​=

1,公差為d=2

d=2d=

2,的等差數列。第n

nn項為:an=

1+(n

−1)×

2=2n

−1a_n=1+(n-1)\times2=2n-1

an​=1+

(n−1

)×2=

2n−1

.先考慮上半部分:

沙漏的第1行是是等差數列的第n項,相鄰的兩行之間相差d,最後一行為1

11要計算剛好構成沙漏的個數,我們只需要對等差數列求和,再減去1,因為上半部分和下半部分重複首項1.

由於上半部分總個數為 (1+

2n−1

)×n2

,所以總

數s=(

1+2n

−1)×

n2×2

−1=n

2−1\frac 2, 所以總數s=\frac 2\times2-1=n^-1

2(1+2n

−1)×

n​,所

以總數s

=2(1

+2n−

1)×n

​×2−

1=n2

−1所以我們求上半部分的行數n

nn則為n+1

2\sqrt2}

2n+1​​

。如果n剛好能構成乙個沙漏,則n+1

2\frac 2

2n+1

​是乙個完全平方數。

所以該函式的意思是,傳入的 n自減,當n剛好能夠構成乙個沙漏時,返回構成該沙漏的行數。

下半部分:

我們把上半部分的最後一行當做下半部分的第二行,所以我們的迴圈輸出從i=2開始,空格的輸出是上半部分的相反迴圈:

先計算上半部分一共有多少行。例如輸入19時,返回值為3

int

getrow

(int i)

else row++;}

return row;

}

#include

#include

#include

#include

using

namespace std;

intgetrow

(int i)

;int

main()

//輸出空格完以後輸出字元

for(

int j=

2*i-

1;j>=

1;j--

)//控制列,第n項個數為2*n-1

}//下半部分

for(

int i=

2;i<=row;i++

)//把沙漏上半部分最後一行當做下半部分的第一行,所以從2開始迴圈

for(

int j=

1;j<=

2*i-

1;j++)}

printf

("%d\n"

,n-cmp)

;//輸出給定的數字n和剛好構成沙漏的數量之差

PAT 1027 列印沙漏 20 分

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

PAT 乙級 1027 列印沙漏 20分

解題關鍵在於找到符號個數與總行數的關係,通過樣例我們可以將圖形分為倒三角和正三角形,它們的共同特點是三角形的每一行都有等差數列關係 即三角形符號個數 1 x n 2 注意這裡只是乙個三角形的符號個數 那麼如何求出項數 n 呢?由圖可以發現n 1 x 2 通過圖,我們也發現,第一行符號的個數 總行數 ...

PAT乙級 1027 列印沙漏 20分

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