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行,注意空格的个数(与行数联系起来)和换行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值