PAT乙級1027列印沙漏
阿新 • • 發佈:2018-11-11
題目描述:
本題要求你寫個程式把給定的符號列印成沙漏的形狀。例如給定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迴圈輸出。