1. 程式人生 > >PAT——乙級1036&乙級1027(有坑)

PAT——乙級1036&乙級1027(有坑)

乙級1036

1036 跟奧巴馬一起程式設計 (15 point(s))

美國總統奧巴馬不僅呼籲所有人都學習程式設計,甚至以身作則編寫程式碼,成為美國曆史上首位編寫計算機程式碼的總統。2014 年底,為慶祝“電腦科學教育周”正式啟動,奧巴馬編寫了很簡單的計算機程式碼:在螢幕上畫一個正方形。現在你也跟他一起畫吧!

輸入格式:

輸入在一行中給出正方形邊長 N(3N20)和組成正方形邊的某種字元 C,間隔一個空格。

輸出格式:

輸出由給定字元 C 畫出的正方形。但是注意到行間距比列間距大,所以為了讓結果看上去更像正方形,我們輸出的行數實際上是列數的 50%(四捨五入取整)。

輸入樣例:

10 a

輸出樣例:

aaaaaaaaaa
a        a
a        a
a        a
aaaaaaaaaa

這個就很簡單了

#include<cstdio>
#include<cmath>

int main(){
    int n;
    char a;
    scanf("%d %c",&n,&a);
    for(int i=0;i<round(float(n)/2.);i++){
        for(int j=0;j<n;j++){
            
if(i==0||i==round(float(n)/2.)-1){ printf("%c",a); }else{ if(j==0||j==n-1){ printf("%c",a); }else{ printf(" "); } } } printf("\n"); } return 0; }

乙級1027

1027 列印沙漏 (20 point(s))

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

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

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

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

輸入格式:

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

輸出格式:

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

輸入樣例:

19 *

輸出樣例:

*****
 ***
  *
 ***
*****
2

 

這道題簡直有毒。。。。我嚴重懷疑出題的嚴謹性。

我第一次提交程式碼,是兩個Answer Wrong。我又修改了一下。。。這兩個成為 Presentation Error格式錯誤了。。。我百思不得其解。

然後看演算法筆記的解法。。。雖然跟我的不一樣。但是他輸出的時候

 

每一行直接換行了,而我是又輸出了幾個空格。跟最長的一樣長了才換行的。看著是一模一樣的。天知道這有個這麼大的坑呀。。。他的輸出格式裡又沒有規定。。。坑爹呀。

我的解法是先算出了上面倒三角形總共有幾行,再一行一行的輸出。比較麻煩。。。

#include<cstdio>
#include<cmath>
int main(){
    int N,n,temp,j;
    char c;
    scanf("%d %c",&N,&c);
    n=int(sqrt((N-1)/2.+1));
    if(n==0&&n>0) n=n-1;
    if(n==1) printf("%c\n",c);
    else{
        for(int i=0;i<n;i++){
            for(j=0;j<i;j++){
                printf(" ");
            }
            for(;j<2*n-1-i;j++){
                printf("%c",c);
            }
            printf("\n");
        }
        for(int i=n-2;i>=0;i--){
            for(j=0;j<i;j++){
                printf(" ");
            }
            for(;j<2*n-1-i;j++){
                printf("%c",c);
            }
            printf("\n");
        }    
    }
    if(n!=0) printf("%d\n",N-(n*n-1)*2-1);
    else printf("%d\n",n);
    
    return 0;
}