1. 程式人生 > >PAT乙級—1027. 列印沙漏(20)-native

PAT乙級—1027. 列印沙漏(20)-native

本題要求你寫個程式把給定的符號列印成沙漏的形狀。例如給定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; }

題目連結: