题目:

本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
(沙漏图略)
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
19 *
输出样例:
(沙漏图略)
2

思路:首先找到规律,得出计算式,为sum = n*(m+1)-1,n是计数,m是行数,然后详细注释在代码中写出。验证一下当输入的值为0或者小于7的时候。

N, symbol = input().split(' ')
he, last_he, last_m = 1, 0, 0   # 后面俩个存储对应的上一个结果
n, m = 1, 1
while int(N) >= he:  # 当输入的值小于规律固定值时退出,1,7,17etc.
    last_m = m
    last_he = he
    n = n + 1
    m = m + 2
    he = n * (m + 1) - 1    # 找到规律,和等于n*(m+1)-1
mid = (last_m + 1) // 2
for i in range(1, mid + 1):     # 先输出上半段包括中间
    print(' ' * (i - 1) + symbol * (last_m - 2 * (i - 1)))
for j in range(mid + 1, last_m + 1):
    # (2 * j - last_m)为 last_m - 2(last_m - j)化简得到
    print(' ' * (last_m - j) + symbol * (2 * j - last_m))
print(int(N) - last_he)