沙漏Python"/>
打印沙漏Python
本题最关键的步骤在于确定输入的n与打印层数之间的关系;本解法中是通过求和来判断层数的,稿图
源码如下
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)
-
将输入的n转换为整数类型,并初始化层数i为0。
-
通过for循环计算出最大可能的沙漏层数,即在循环中判断当前层数的沙漏需要的符号数量是否大于n,如果大于n,则当前层数减1并退出循环。
-
计算出剩余符号数量remain,即n减去已经用于打印沙漏的符号数量。
-
通过for循环分别打印上半部分和下半部分的沙漏,上半部分从row到1循环,下半部分从0到row循环。每行打印row-i个空格和2i+1个字符。
-
最后打印剩余符号数量remain
我们发现只有当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)
在修改后的代码中,如果输入为0,程序将会直接输出0;如果输入为1,程序将会直接输出字符,并且输出0;如果输入为2或3,程序将会直接输出一个字符,并计算剩余符号数量remain。如果输入大于等于4,程序将会执行原来的打印沙漏
更多推荐
打印沙漏Python
发布评论