本篇将深入讲解PTA平台上的题目 L1-002 打印沙漏,通过符号打印与循环控制的结合,构建一个沙漏形状,进一步强化对循环、条件判断及输出控制的掌握。
关键词
- PTA刷题
- 打印沙漏
- 循环控制
- 输出格式
- 算法练习
一、L1-002 打印沙漏
题目描述:输入一个正整数 N,用字符 * 打印出一个沙漏形状,要求符号数量尽可能使用完。
- 输入格式:正整数 N(1 ≤ N ≤ 1000)。
- 输出格式:打印出沙漏形状,符号间隔使用空格,符号数多时尽量均匀分布。
解题思路
- 确定行数:首先需要根据输入的 N 计算出最大行数,使符号尽量用完。通过公式 2 * row * row - 1 计算每行符号数量,直到符号总数不超过 N。
- 对称打印:沙漏的上半部分和下半部分是对称的。打印上半部分后,利用相同的逻辑打印下半部分。
- 剩余符号:如果构建沙漏后有剩余符号,输出剩余的符号数量。
代码实现
package cjcDemo
import std.console.*
import std.convert.*
// 计算沙漏形状并输出
func printSandGlass(N: Int64, shape: String): Unit {
var row = 1
var totalUsed = 1
// 寻找最大行数
while (2 * row * row - 1 <= N) {
totalUsed = 2 * row * row - 1
row += 1
}
row -= 1
// 打印上半部分
for (i in 0..row) {
let start = row - i
for (_ in 0..i) {
print(' ')
}
for (_ in 0..2 * start - 1) {
print(shape)
}
print('\n')
}
// 打印下半部分
for (i in 1..row) {
let space = row - i
for (_ 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
來源:坚果派
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。