「PAT乙级真题解析」Basic Level 1027 打印沙漏 (问题分析+完整步骤+伪代码描述+提交通过代码)
创始人
2024-02-25 10:16:30
0次

乙级的题目训练主要用来熟悉编程语言的语法和形成良好的编码习惯和编码规范。从小白开始逐步掌握用编程解决问题。

PAT (Basic Level) Practice 1027 打印沙漏

问题分析

题设给定了可用的符号数量, 要求输出能够打印出的最大的沙漏。
如果知道要输出几层, 问题会变得简单,就是一个循环加输出的操作。
所以我们需要先计算出要输出几层。

层数计算

  1. 方案一: 直接按照输出累加需要使用的符号数量, 找到小于等于可用符号量的最大使用值
  2. 方案二: 数学公式
    以输入样例为例:
    使用的符号数量为:
1 + 3 + 3 + 5 + 5 
= (1 + 3 + 5) * 2 - 1
= (1 + 5) * 3 / 2 * 2 - 1
= (1 + 5) * 3 - 1
= 17

替换为层数为:

(1 + row * 2 - 1) * row - 1 = 2 * row * row - 1

根据层数打印沙漏

我们需要知道需要输出多少个空格, 多少个符号以及用哪个符号输出(或者每层的宽度),
然后输出指定数量和空格和符号。
如果我们这样设计, 然后在外层就需要计算好每一层需要的空格和符号数目后传入。
算出层数之后, 从0开始到层数-1, 需要输出的空格就是对应的索引值。
每层的宽度 = 层数 * 2 - 1

完整步骤描述

  1. 获取输入: 可用的符号数量, 使用的符号
  2. 计算层数
  3. 计算每层宽度
  4. 从0到层数-1:
    • 计算空格数, 打印每层的形状
  5. 从层数-2到0:
    • 计算空格数, 打印每层的形状
  6. 输出剩余的可用符号数量

伪代码描述

  1. get input: available_amount, sign
  2. calculate layer_amount
  3. calculate width = layer_amount * 2 - 1
  4. for idx in range(0, layer_amount):
    • print_layer(sign=sign, space_amount=idx, width=width)
  5. for idx in range(layer_amount-1, -1, -1):
    • print_layer(sign=sign, space_amount=idx, width=width)
  6. print(available_amount - (2 * layer_amount * layer_amount - 1));

完整提交代码

/*
# 问题分析
题设给定了可用的符号数量, 要求输出能够打印出的最大的沙漏。
如果知道要输出几层, 问题会变得简单,就是一个循环加输出的操作。
所以我们需要先计算出要输出几层。## 层数计算
1. 方案一: 直接按照输出累加需要使用的符号数量, 找到小于等于可用符号量的最大使用值
2. 方案二: 数学公式
以输入样例为例:
使用的符号数量为: 1 + 3 + 3 + 5 + 5 
= (1 + 3 + 5) * 2 - 1
= (1 + 5) * 3 / 2 * 2 - 1
= (1 + 5) * 3 - 1
= 17替换为层数为:(1 + row * 2 - 1) * row - 1 = 2 * row * row - 1## 根据层数打印沙漏
我们需要知道需要输出多少个空格, 多少个符号以及用哪个符号输出(或者每层的宽度),
然后输出指定数量和空格和符号。
如果我们这样设计, 然后在外层就需要计算好每一层需要的空格和符号数目后传入。
算出层数之后, 从0开始到层数-1, 需要输出的空格就是对应的索引值。
每层的宽度 = 层数 * 2 - 1# 完整步骤描述
1. 获取输入: 可用的符号数量, 使用的符号
2. 计算层数
3. 计算每层宽度
4. 从0到层数-1:- 计算空格数, 打印每层的形状
5. 从层数-2到0:- 计算空格数, 打印每层的形状
6. 输出剩余的可用符号数量# 伪代码描述
1. get input: available_amount, sign
2. calculate layer_amount
3. calculate width = layer_amount * 2 - 1
4. for idx in range(0, layer_amount):- print_layer(sign=sign, space_amount=idx, width=width)
5. for idx in range(layer_amount-1, -1, -1):- print_layer(sign=sign, space_amount=idx, width=width)
6. print(available_amount - (2 * layer_amount * layer_amount - 1));
*/# includeint calculate_layer_amount(int available_amount){for (int row = 0; row <= available_amount+1; row++) {if (2 * row * row - 1 > available_amount) {return row - 1;}}return 0;
}int print_layer(char sign, int space_amount, int width){for (int i = 0; i < space_amount; i++){printf(" ");}int char_amount = width - space_amount * 2;for (int i = 0; i < char_amount; i++){printf("%c", sign);}printf("\n");
}int main(){int available_amount;char sign;scanf("%d %c", &available_amount, &sign);int layer_amount = calculate_layer_amount(available_amount);int width = layer_amount * 2 - 1;for (int i = 0; i < layer_amount; i++){print_layer(sign, i, width);}for (int i = layer_amount - 2; i >= 0; i--){print_layer(sign, i, width);}printf("%d", available_amount - (2 * layer_amount * layer_amount - 1));return 0;
}

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...