「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;
}

相关内容

热门资讯

保存时出现了1个错误,导致这篇... 当保存文章时出现错误时,可以通过以下步骤解决问题:查看错误信息:查看错误提示信息可以帮助我们了解具体...
汇川伺服电机位置控制模式参数配... 1. 基本控制参数设置 1)设置位置控制模式   2)绝对值位置线性模...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
表格中数据未显示 当表格中的数据未显示时,可能是由于以下几个原因导致的:HTML代码问题:检查表格的HTML代码是否正...
本地主机上的图像未显示 问题描述:在本地主机上显示图像时,图像未能正常显示。解决方法:以下是一些可能的解决方法,具体取决于问...
表格列调整大小出现问题 问题描述:表格列调整大小出现问题,无法正常调整列宽。解决方法:检查表格的布局方式是否正确。确保表格使...
不一致的条件格式 要解决不一致的条件格式问题,可以按照以下步骤进行:确定条件格式的规则:首先,需要明确条件格式的规则是...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...