1. 程式人生 > >PAT乙級1027列印沙漏

PAT乙級1027列印沙漏

題目描述:
本題要求你寫個程式把給定的符號列印成沙漏的形狀。例如給定17個“*”,要求按下列格式列印
在這裡插入圖片描述

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

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

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

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

輸入樣例:
19 *
輸出樣例:
在這裡插入圖片描述

程式碼如下:

#include <
iostream>
#include <cmath> #include<iomanip> using namespace std; int main() { int n,m,c; char a; cin>>n>>a; m=2*sqrt((n+1)/2)-1; if(m%2==0) m-=1; //m為最頂層的星星個數 c=n-2*pow((m+1)/2,2)+1; for(int i=0,k=m;i<=m/2;k-=2,i++){ int p=k; cout<<
setw(i+1); while(p--){ cout<<a; } cout<<endl; } for(int i=m/2,k=3;i>0;k+=2,i--){ int p=k; cout<<setw(i); while(p--){ cout<<a; } cout<<endl; } cout<<c; return
0; }

來總結一下:
1)首先先通過數學方法確定頂層星星的個數,順便求一下差值。
2)通過兩個相反的for迴圈輸出。