1027 列印沙漏 20 PAT乙級真題

2021-08-11 15:35:23 字數 1063 閱讀 6722

1027. 列印沙漏(20)

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

*****

**** ***

*****

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

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

輸入格式:

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

輸出格式:

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

輸入樣例:

19 *

輸出樣例:

*****

**** ***

*****

2

這道題別看是一道不算很難的題目,但是如果要想優化還得化為數學問題來簡化模型。我們不妨先不看數字,而是從輸出的圖形看起,一開始可以看為1個*,圖形的總*的遞增規律就是(1+3)*2-1,(1+3+5)*2-1,···用等差數列求和公式算一下化簡了以後,為2*n^2-1=s(s為總*數,n為從第一行到只有乙個*的行數)。這時候再倒過來看n=sqrt((s+1)/2),找到了這樣的數學關係以後再推出來還剩多少沒用的就簡單多了。

輸出方面我一開始是用了兩個迴圈來分別實現上下兩半的圖形輸出的,但後來發現fabs這個函式能解決差為負的情況,輸出就又得到了優化,下面是我的**:

#include#includeint main(void)

{ int n,i,a,j,k;

char c;

scanf("%d %c",&n,&c);

i=sqrt((n+1)/2); //i的結果為上半個圖形的行數

n-=2*i*i-1; //這裡n的結果是還剩多少沒用的了

k=2*i-1; //k這裡為總行數

for (i=0;i

1027 列印沙漏 20 PAT乙級

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

1027 列印沙漏 20 PAT乙級

時間限制 200 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 chen,yue 本題要求你寫個程式把給定的符號列印成沙漏的形狀。例如給定17個 要求按下列格式列印 所謂 沙漏形狀 是指每行輸出奇數個符號 各行符號中心對齊 相鄰兩行符號數差2 符號數先...

1027 列印沙漏 20 PAT乙級真題

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