1. 程式人生 > >PAT_B_1027 列印沙漏 (20 分)【測試點0,3格式錯誤】【測試點2答案錯誤】

PAT_B_1027 列印沙漏 (20 分)【測試點0,3格式錯誤】【測試點2答案錯誤】

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

*****
 ***
  *
 ***
*****

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

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

輸入格式:

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

輸出格式:

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

輸入樣例:

19 *

輸出樣例:

*****
 ***
  *
 ***
*****
2
#include <iostream>

using namespace std;

int main()
{
    int n;
    char tu;
    cin>>n>>tu;
    int i=1;
    int count=0;
    for( ;n-count>=i*2;i+=2)
    {
        if(i==1) count+=i;
        else count+=i*2;
    }
    i-=2;
    int remainder=n-count;
    int mid=i/2;
    for(int j=0;j<i;j++)
    {
        int abs=mid-j>0?mid-j:j-mid;
        for(int k=0;k<i;k++)
        {
            if(k<mid-abs)
                cout<<" ";
            else if(k<=mid+abs)
                cout<<tu;
            else break;       //測試點0,3的格式錯誤原因,只在符號之前有空格,空格之後沒有空格
        }
        cout<<endl;
    }
    if(n==1) cout<<tu<<endl<<0;    //測試點1,出錯處,測試點1的測試值根據博主死磕的結果,應為1
    if(n>1) cout<<remainder;
    return 0;
}