

目录
一、理清打印字符逻辑,总结打印沙漏核心数学公式
二、输入数据,求出最大完整层数k
三、打印沙漏。
3.1 打印上半部分
3.2 打印下半部分
3.3 输出剩余符号数
一、理清打印字符逻辑,总结打印沙漏核心数学公式
我们将沙漏拆成「上半部分 + 下半部分」,再合并重复的中间层,结合每层的符号数规律推导。
沙漏的每一层(横向的一行),符号数是奇数递增 / 递减的。
以上半层为例,假设最大完整层数k=3,
- 第 3 层(最外层):5 个符号(2×3-1)
- 第 2 层:3 个符号(2×2-1)
- 第 1 层(中间层):1 个符号(2×1-1)
[上半部分]的符号和为5+3+1=9
根据等差数列公式:和 = 项数 × (首项+末项) / 2 推导通用公式
[上半部分] 总符号数为k*(2*k-1+1)/2 = 2*k**2/2=k**2
同理下半部分等于k**2-1(1为重复部分)
求沙漏总符号数的通用公式为2*k**2-1
二、输入数据,求出最大完整层数k
这里需要注意的是求k,用到了试探思想,用k+1做「试探」,判断当前的 k 能不能再变大,只有试探成功(满足公式),才把 k 更新成更大的数,最终让 k 停在「最大符合条件的值」上。
n,c =input().split() n=int(n) k=1
#求和公式 while 2*(k+1)**2-1 <= n: k+=1
三、打印沙漏。
3.1 打印上半部分
for i in range(k,0,-1):#上半部分倒放,从最外层向第一层打印 spaces = k-i#左对齐前置空格数 chars = 2*i-1#字符数 print(" "*spaces + c * chars )#打印结果
3.2 打印下半部分
for i in range(2,k+1):#因为第一层为重复部分,从第二层开始打印到第k层 spaces = k-i#左对齐前置空格数 chars = 2*i-1#字符数 print(" "*spaces + c * chars)#打印结果
3.3 输出剩余符号数
total_chars = 2*k**2-1 remaining = n-total_chars print(remaining)
完整代码:
n,c =input().split() n=int(n) k=1
#求和公式 while 2*(k+1)**2-1 <= n: k+=1 for i in range(k,0,-1): spaces = k-i chars = 2*i-1 print(" "*spaces + c * chars ) for i in range(2,k+1): spaces = k-i chars = 2*i-1 print(" "*spaces + c * chars)
total_chars = 2*k**2-1 remaining = n-total_chars print(remaining)
提交结果:



