PAT 乙级 1027 打印沙漏

该博客介绍了一个C语言程序,用于根据输入的符号数量和符号类型生成最大的沙漏图案,并计算并输出剩余未使用的符号数量。程序通过计算等差数列确定沙漏的行数,然后动态调整符号和空格的输出来形成沙漏形状。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

输入格式:

输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。

输出格式:

首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。

输入样例:

19 *

输出样例:

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

C语言实现

#include <stdio.h>
#include <math.h>
int main() {
    int n;
    char tmp, c;
    scanf("%d%c%c", &n, &tmp, &c);
    // 求出上三角一共有多少行
    int rows = sqrt((n + 1) / 2);
    // 求出第一行符号个数, 即一行最多符号个数
    int cnt_c_org = 2 * rows - 1;
    int cnt_c = cnt_c_org;
    int cnt_space = 0;
    int delta_c, delta_s;
    // 定义符号和空白个数的增量
    delta_c = 2, delta_s = 1;
    while (cnt_c <= cnt_c_org) {
        for (int i = 0; i < cnt_space; ++i) {
            printf("%c", ' ');
        }
        for (int i = 0; i < cnt_c; ++i) {
            printf("%c", c);
        }
        printf("\n");
        // 当符号个数为1时,增量取反
        if (cnt_c == 1) {
            delta_c = -2;
            delta_s = -1;
        }
        cnt_c -= delta_c;
        cnt_space += delta_s;
    }
    // 输出剩余符号个数
    printf("%d", n - 2 * rows * rows + 1);
    return 0;
}

思路

1.沙漏由一个三角形和一个少顶点的三角形组成。设完整三角形有n行,每行的个数为1, 3, 5, 7,...,是等差数列.a_n = 2n + 1s_n = n^2。所以沙漏中符号个数为S_n = n^2 + n^2 - 1 = 2n^2 -1. 已知符号个数为t,则完整三角形的行数为row = \sqrt{\frac{t + 1} {2}}.

2.观察图形可知,打印沙漏,就要打印空白符号和标记符号,每增加一行,空白符号先加后减,增量绝对值为1.标记符号先减后加,增量绝对值为2. 当标记符号输出一个时,增量符号发生变化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值