【PAT乙級】1027 列印沙漏

陌巷舊雨發表於2020-11-06

問題描述
本題要求你寫個程式把給定的符號列印成沙漏的形狀。例如給定17個“*”,要求按下列格式列印
在這裡插入圖片描述
所謂“沙漏形狀”,是指每行輸出奇數個符號;各行符號中心對齊;相鄰兩行符號數差2;符號數先從大到小順序遞減到1,再從小到大順序遞增;首尾符號數相等。
給定任意N個符號,不一定能正好組成一個沙漏。要求列印出的沙漏能用掉儘可能多的符號。

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

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

樣例輸入
19 *

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

C++程式碼

#include<bits/stdc++.h>
using namespace std;

int sum(int i){
    return 2*i*i - 1;
}

int findk(int n){
    for(int i=1;i<50;i++){
        if(sum(i)<=n&&sum(i+1)>n)
            return i-1;
    }
}

void outspace(int k){
    for(int i=0;i<k;i++){
        printf(" ");
    }
}
void outc(int k,char c){
    for(int i=0;i<k;i++){
        printf("%c",c);
    }
}

void upout(int k,char c){
    int i=2*k+1,j=0;
    while(k--){
        outspace(j);
        outc(i,c);
        cout<<endl;
        i-=2;
        j+=1;
    }
}

void midout(int k,char c){
    outspace(k);
    cout<<c<<endl;
}

void downout(int k,char c){
    int i=3,j=k-1;
    while(k--){
        outspace(j);
        outc(i,c);
        cout<<endl;
        i+=2;
        j-=1;
    }
}

int main(){
    int n;
    char c;
    cin>>n>>c;

    int k = findk(n);
    upout(k,c);
    outspace(k); cout<<c<<endl;
    downout(k,c);
    if(n-sum(k+1)!=0)
        cout<<n-sum(k+1);
    return 0;
}

備註
一個測試點錯誤……
我的程式碼好醜
Think Twice,Code Once !!!

相關文章