欢迎光临
我们一直在努力

L1-002打印沙漏

目录

一、理清打印字符逻辑,总结打印沙漏核心数学公式

二、输入数据,求出最大完整层数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)

提交结果:

赞(0)
未经允许不得转载:171主机测评 » L1-002打印沙漏
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址