本篇将深入讲解PTA平台上的题目 L1-002 打印沙漏,通过符号打印与循环控制的结合,构建一个沙漏形状,进一步强化对循环、条件判断及输出控制的掌握。
关键词
- PTA刷题
- 打印沙漏
- 循环控制
- 输出格式
- 算法练习
一、L1-002 打印沙漏
题目描述:输入一个正整数 N,用字符 * 打印出一个沙漏形状,要求符号数量尽可能使用完。
- 输入格式:正整数 N(1 ≤ N ≤ 1000)。
- 输出格式:打印出沙漏形状,符号间隔使用空格,符号数多时尽量均匀分布。
解题思路
- 确定行数:首先需要根据输入的 N 计算出最大行数,使符号尽量用完。通过公式 2 * row * row - 1 计算每行符号数量,直到符号总数不超过 N。
- 对称打印:沙漏的上半部分和下半部分是对称的。打印上半部分后,利用相同的逻辑打印下半部分。
- 剩余符号:如果构建沙漏后有剩余符号,输出剩余的符号数量。
代码实现
package cjcDemoimport std.console.*
import std.convert.*// 计算沙漏形状并输出
func printSandGlass(N: Int64, shape: String): Unit {var row = 1var totalUsed = 1// 寻找最大行数while (2 * row * row - 1 <= N) {totalUsed = 2 * row * row - 1row += 1}row -= 1// 打印上半部分for (i in 0..row) {let start = row - ifor (_ in 0..i) {print(' ')}for (_ in 0..2 * start - 1) {print(shape)}print('\n')}// 打印下半部分for (i in 1..row) {let space = row - ifor (_ in 1..space) {print(' ')}for (_ in 0..2 * i + 1) {print(shape)}print('\n')}println("${N - totalUsed}")
}main(): Int64 {var c = Console.stdIn.readln()var r = c.getOrThrow()var arr:Array<String> =r.split(' ')let N = Int64.parse(arr[0])let shape = arr[1]// 执行测试printSandGlass(N, shape)return 0
}
代码详解
- 最大行数计算:通过 2 * row * row - 1 的公式,计算每行符号数量,直到符号总数不超过 N。
- 打印上半部分:从最大行数开始,每行符号逐渐减少,同时根据行号增加空格,实现沙漏上半部分。
- 打印下半部分:下半部分与上半部分对称,通过同样的逻辑从第二行开始逐步打印。
- 剩余符号:如果沙漏无法用完所有符号,输出剩余符号数。
示例执行
输入:
19 *
输出:
************
*****
2
这道题目考察了循环控制及输出格式的精确性,非常适合锻炼基础算法的设计能力。
小结
本篇通过实现 L1-002 打印沙漏 题目,进一步强化了对循环结构和格式控制的理解与应用。复杂度比上一道题有所提升,练习了打印格式的对称控制。
下篇预告
下一篇将继续讲解PTA题目,逐步解决 L1-003 个位数统计,敬请期待 「Mac玩转仓颉内测版12」PTA刷题篇3 - L1-003 个位数统计。
上一篇:「Mac玩转仓颉内测版10」PTA刷题篇1 - L1-001 Hello World
下一篇:「Mac玩转仓颉内测版12」PTA刷题篇3 - L1-003 个位数统计
作者:SoraLuna
链接:https://www.nutpi.net/thread?topicId=156
來源:坚果派
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。