本題要求你寫個程式把給定的符號列印成沙漏的形狀。例如給定17個「*」,要求按下列格式列印:
∗∗∗∗∗*****
∗∗∗∗∗∗∗∗
***∗∗∗∗*
∗∗∗∗***
∗∗∗∗∗∗
∗∗*****
∗∗∗∗
∗
輸入格式:輸入在一行給出1個正整數n(≤1000)和乙個符號,中間以空格分隔。
輸出格式:首先列印出由給定符號組成的最大的沙漏形狀,最後在一行中輸出剩下沒用掉的符號數。輸入樣例:
19 *
輸出樣例:
∗∗∗列印沙漏是關於等差數列的題。該等差數列是乙個首項a1=∗∗*****
∗∗∗∗∗∗∗∗
***∗∗∗∗*
∗∗∗∗***
∗∗∗∗∗∗
∗∗*****
∗∗∗∗∗2
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個符號,不一定能正好組成乙個沙漏。要求列印出的沙漏能用掉盡可能...