PAT B1036:跟奥巴马一起编程

  • 思路:按要求输入即可,注意要求(宽度=长度/2,四舍五入),先判断长度是否为偶数,若不是/2后+1;

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

PAT B1027:打印沙漏

  • 数学题,先求有几层(从3 5 7 由等差数列得递推式:2i+1),(3+5+7……累加和(3+2i+1)i/2 ->i(i+2));给出n个,满足,2i(i+2)+1>n,找最小的i(层数),则层数为i-1;
  • 规则打印:先打上半部(先打空格,观察得空格个数是0 1 2等,假如3层,i=3,0个;i=2,1个;i=1,2个;所以用总的层数-当前层数(3-3,3-2,3-1)来输出空格),(打印字符,每层字符个数2i+1)

    #include <cstdio>
    
    int main() {
        int N, row = 0; //row行数
        char C;
        scanf("%d %c", &N, &C);
        for (int i = 0; i < N; i++) { //i表示最中间上面的层数,不包括最中间
            if (2 * i*(i + 2) + 1 > N) {
                row = i - 1;
                break;
            }
        }
        for (int i = row; i >= 1; i--) { //从最上面一行开始,输出完row-1
            for (int k = 0; k < row - i; k++)
                printf(" ");//输出字符前输出空格
            for (int j = 0; j < 2 * i + 1; j++)
                printf("%c", C); //第i行符号数有(等差数列):2*i+1
            printf("\n");//每行输出完换行
        }
        for (int i = 0; i < row; i++)
            printf(" ");//中间行输出的空格
        printf("%c", C);
        printf("\n");
        for (int i = 1; i <= row; i++) { //输出下半部分
            for (int k = 0; k < row - i; k++)
                printf(" ");
            for (int j = 2 * i + 1; j >= 1; j--)
                printf("%c", C);
            printf("\n");
        }
        printf("%d", N - (2 * row * (row + 2) + 1));
        return 0;
    }

PAT A1031:Hello World for U

  • 题目大意:给出一串字符要求打印成U形状,且要求U的两边长度相同且最大,底边保证不少于两边的长度(n1=n3=max,n1+n2+n3−2=N);
  • 思路:找到边长及底端长,根据题目,n=(len+2)/3;d=n+(len+2)%3;(首先让三边相等,多余出来的加入底边)。然后根据要求输出(先输出左边,空格(最后一行输出底边),右边);

    #include <cstdio>
    #include <cstring>
    
    int main(){
        int n,d;
        char arr[85];
        scanf("%s",arr);
        int len=strlen(arr);
        n=(len+2)/3;
        d=n+(len+2)%3;
        for(int i=0;i<n;i++){
            printf("%c",arr[i]);
            if(i<n-1){
                for(int j=0;j<d-2;j++)
                    printf(" ");
            }else{
                for(int j=0;j<d-2;j++)
                    printf("%c",arr[i+j+1]);
            }
            printf("%c\n",arr[len-1-i]);
        }
        return 0;
    }