欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

PAT 1027打印沙漏

程序员文章站 2024-03-08 09:49:28
...

PAT 1027打印沙漏

#include <stdio.h>
int emm(int n){
    for(int i=1;i<=25;i++){
        int xixi=(i+1)*(i+1)*2-1;
        int haha=i*i*2-1;
        if(n==haha||(n>haha&&n<xixi)){
            return i;
        }
    }
    return 0;
}
int yu(int n){
    for(int i=1;i<=25;i++){
        int xixi=(i+1)*(i+1)*2-1;
        int haha=i*i*2-1;
        if(n==haha||(n>haha&&n<xixi)){
            return n-haha;
        }
    }
    return 0;
}
int main(int argc, char const *argv[])
{
    int a;
    char ch;
    scanf("%d %c",&a,&ch);
    int e=emm(a);
    //row
    for(int i=1;i<=e;i++){
        for(int j=1;j<=i-1;j++){
            printf(" ");
        }
        for(int j=1;j<=2*e-1-2*(i-1);j++){
            printf("%c",ch);
        }
        printf("\n");
    }
    for(int i=2;i<=e;i++){
        for(int j=1;j<=e-i;j++){
            printf(" ");
        }
        for(int j=1;j<=2*i-1;j++){
            printf("%c",ch);
        }
        printf("\n");
    }
    int sheng=yu(a);
    printf("%d\n",sheng);
    return 0;
}

1.根据数列写出递推公式an-a(n-1)=2*(2n-1)
2.根据数列性质求得an=2n^2-1
3.emm函数用来找那个n,n的含义为沙漏最宽到最窄的行数,例如
7 5 3 1 3 5 7 n=4
5 3 1 3 5 n=3
4.复制emm函数稍加修改我们可以得到剩余没用完的符号
5.找到n就可以输出了,我是先输出n行,再输出后n-1行,注意空格的个数(与行数联系起来)和换行