PTA7-40 打印沙漏(python)
·
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
19 *
输出样例:
2
# 导入math库
import math
# 这里利用数组输入个数和标志,个数用int(s[0])表示,标志用s[1]表示
s=list(input().split(' '))
# 求k
k=int(math.sqrt((int(s[0])+1)/2))
# 打印沙漏
# 先打印上半边的沙漏
for i in range(k):
# 根据题目要求,都是沿着中心点对称的,所以这里需要打印空格。用k=3举例,i=0时,不需要空格,当i=1时,需要一个空格....以此类推。(见题图)
print(' '*i,end='')
# 这里你需要意识到,上半边是倒着的沙漏,是从多到少的。
# 同样以k=3举例,当i=0时,打印第一行,公式为2*(k-i)-1...以此类推。
print(s[1]*(2*(k-i)-1))
# 打印下半边。
# 这里是从小到大,但是由于中间部分只有一个的‘*’已经在上半边打印过了,所以我们现在只需要打印剩下的部分。
# 所以是从2开始,这里可以理解k为上半边(包括只有一个标志的那一行)的层数,所以只用到k即可
# 但是,这里的range(2,k)表示[2,k),所以我们写range(2,k+1)
for j in range(2,k+1):
# 接下来与上半部分原理一致,只是行数不一致,需要修改,理解即可
print(' '*(k-j),end='')
print(s[1]*(2*j-1))
# 打印剩余没有使用的部分
print(int(s[0])-(2*k**2-1))
更多推荐


所有评论(0)