2 条题解

  • 2
    @ 2024-10-21 12:25:34

    对于打印题最主要的就是找规律,我们观察后能够发现该爱心的打印分为三种情况。 在分析情况之前我们会得知爱心的大小均为7的倍数,所以我们先定义一个阶数num表示爱心是第几阶的,num = n / 7(即如果n = 7,则 num = 1,表示该爱心为1阶的)。 对于每种情况我们会发现:

    1. 第一,我们能够发现从第1行到第num + 1是由两个空格三角形和两个星 三角形/梯形 组成的。星梯形成每行 +4 进行递增。
    2. 第二, 从num + 2 到 num + 1 + (num - 1) * 2 + 1 输出的均为星,输出的数目是第num + 行星数目 + 3。
    3. 第三, 剩余的部分,即从num + 1 + (num - 1) * 2 + 1 + 1行到第 n 行, 输出一个三角形空格 和 一个倒置的三角形星。需要注意的是最后一行是一个星,在循环遍历每一行的时候需要特判该行。
    #include<stdio.h>
    int main() {
        int t;
        scanf("%d", &t);
        while (t--) {
            int n;
            scanf("%d", &n);
            int num = n / 7, cnt = (1 + (num - 1) * 4), cnt2 = 0, flag = 0, flag2 = 0;
            for(int i = 1; i <= n; i++) {
                if(i <= num + 1) {//第一种
                    printf(" ");
                    for(int j = 1; j <= (num - i + 1) * 2; j++) {
                        printf(" ");
                    }
                    for (int j = 1; j <= cnt; j++) {
                        printf("*");
                    }
                    for(int j = 1; j <= (num - i + 1) * 4 + 1; j++) {
                        printf(" ");
                    }
                    for (int j = 1; j <= cnt; j++) {
                        printf("*");
                    }
                    cnt += 4;
                } else if (i <= num + 1 + (num - 1) * 2 + 1) {//第二种
                    if (flag == 0) {
                        cnt = (cnt - 4) * 2;
                        cnt += 3;
                        flag++;
                    }
                    for(int j = 1; j <= cnt; j++) {
                        printf("*");
                    }
                } else {//第三种
                    if (flag2 == 0) {
                        cnt2++;
                        cnt-=2;
                        flag2++;
                    } else {
                        cnt -= 4;
                        cnt2 += 2;
                    }
                    if (cnt < 0) {
                        cnt = 1;
                        cnt2--;
                    }
                    for(int j = 1; j <= cnt2; j++) {
                        printf(" ");
                    }
                    for(int j = 1; j <= cnt; j++) {
                        printf("*");
                    }
                }
                printf("\n");
            }
        }
        return 0;
    }
    

    信息

    ID
    1022
    时间
    1000ms
    内存
    256MiB
    难度
    4
    标签
    递交数
    31
    已通过
    16
    上传者