打印沙漏Python

6613edf8b6a742e5b231b1dd71b18cbb.jpg

本题最关键的步骤在于确定输入的n与打印层数之间的关系;本解法中是通过求和来判断层数的,稿图

d7fc78fb4fb3487c9a0f5d9cfe8b1ef7.jpg

源码如下

n,char=input().split()
n=int(n)
for i in range(n):
    if ((2*i*(i+2))+1)>n:
        row=i-1
        break
remain=n-((2*row*(row+2))+1)
for i in range(row,0,-1):
    line=" "*(row-i)+char*(2*i+1)
    print(line)
for i in range(row+1):
    line=" "*(row-i)+char*(2*i+1)
    print(line)
print(remain)

  1. 将输入的n转换为整数类型,并初始化层数i为0。

  2. 通过for循环计算出最大可能的沙漏层数,即在循环中判断当前层数的沙漏需要的符号数量是否大于n,如果大于n,则当前层数减1并退出循环。

  3. 计算出剩余符号数量remain,即n减去已经用于打印沙漏的符号数量。

  4. 通过for循环分别打印上半部分和下半部分的沙漏,上半部分从row到1循环,下半部分从0到row循环。每行打印row-i个空格和2i+1个字符。

  5. 最后打印剩余符号数量remain

d99f4d0e1c774966a73f5087dd5f6fff.png

  194abb40ec384794ae96b56d9358b0ab.png49b4c591bc1b4a5e95dd00b1610c9263.png

 我们发现只有当n>=4时,该代码可以执行结果;当n=0,1,2,3时,会报错NameError。如果输入为0,程序将会出错,因为在for循环中,range(0)将不会执行任何操作,row将不会被初始化,导致后面计算剩余符号数量remain时出现错误。如果输入为1、2或3,程序将会输出一行空格,但是实际上应该输出一个字符。

因此我们在该代码基础上加入一些特判

n, char = input().split()
n = int(n)
if n == 0:  # 处理输入为0的情况
    print(0)
elif n == 1:  # 处理输入为1的情况
    print(char)
    print("0")
else:
    for i in range(n):
        if ((2*i*(i+2))+1)>n:
            row=i-1
            break
    remain=n-((2*row*(row+2))+1)
    if row == -1:  # 处理输入为2或3的情况
        row = 0
        remain = n-1
        print(char)
    else:
        for i in range(row,0,-1):
            line=" "*(row-i)+char*(2*i+1)
            print(line)
        for i in range(row+1):
            line=" "*(row-i)+char*(2*i+1)
            print(line)
    print(remain)

5819e37d7b4243b2803883aec5f3bc5f.png

 在修改后的代码中,如果输入为0,程序将会直接输出0;如果输入为1,程序将会直接输出字符,并且输出0;如果输入为2或3,程序将会直接输出一个字符,并计算剩余符号数量remain。如果输入大于等于4,程序将会执行原来的打印沙漏

 f15c9f7e4a3b4ab293741a31fdfbc1c6.pngc9bc7bdc059140cb92955360d21cb31f.pngda898bcff4604095a6b2ff2e25d980c2.png 

 

 

 

 

 

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值