PAT乙級—1027. 列印沙漏(20)-native
阿新 • • 發佈:2019-02-17
本題要求你寫個程式把給定的符號列印成沙漏的形狀。例如給定17個“*”,要求按下列格式列印
*****
***
*
***
*****
所謂“沙漏形狀”,是指每行輸出奇數個符號;各行符號中心對齊;相鄰兩行符號數差2;符號數先從大到小順序遞減到1,再從小到大順序遞增;首尾符號數相等。
給定任意N個符號,不一定能正好組成一個沙漏。要求打印出的沙漏能用掉儘可能多的符號。
輸入格式:
輸入在一行給出1個正整數N(<=1000)和一個符號,中間以空格分隔。
輸出格式:
首先打印出由給定符號組成的最大的沙漏形狀,最後在一行中輸出剩下沒用掉的符號數。
輸入樣例:
19 *
輸出樣例:
*****
***
*
***
*****
2
思路:此題計算出1000以內可以組成沙漏的符號個數存於a陣列,遍歷a陣列找到第一個>N的元素,則它的前一個元素即為題意要求的沙漏的符號個數,這裡有一個規律即組成沙漏的符號個數除以下標即為沙漏的行數,最後分別輸出沙漏的上半部分和下半部分
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int N;
int a[50]={0};
char c;
cin>>N>>c;
int temp=1;
int count=1;
while(temp<=1000) //找出符合沙漏的符號數
{
a[count]=temp;
temp=temp+2*(2*count+1);//符號數有此規律
count++;
}
int left=0,hang=0;
for(int i=1;i<count;i++) //注意為防止除以0,a陣列第一個元素為a[1]
{
if(a[i]>N) //算出行數和剩餘的符號數
{
hang=a[i-1 ]/(i-1);
left=N-a[i-1];
break;
}
else if(i==count-1)//最後一個1000以內的符號數<1000且下一個>1000
{ //1000以內找不到大於N的符號數則就是處理最後一個元素
hang=a[i]/i;
left=N-a[i];
}
}
for(int i=0;i<hang/2+1;i++) //輸出沙漏的上半部分
{
for(int j=0;j<i;j++)//注意兩個for迴圈
{
cout<<" ";
}
for(int j=0;j<hang-2*i;j++)
{
cout<<c;
}
cout<<endl;
}
for(int i=0;i<hang/2;i++)//輸出下半部分
{
for(int j=0;j<hang/2-1-i;j++)
{
cout<<" ";
}
for(int j=0;j<2*(i+1)+1;j++)
{
cout<<c;
}
cout<<endl;
}
cout<<left<<endl;
return 0;
}
題目連結: