本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印

*****

***

*

***

*****

所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。

给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

输入格式:

输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。

输出格式:

首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。

输入样例:

19 *

输出样例:

*****

***

*

***

*****

2

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 M

首先,根据要求,层数每增加一,沙漏图形上下两边各增加一层,我们先实现对打印沙漏符号总数的计算,根据规律,假设符号为“*”,假设只有一层,则应该打印:

*

假设存在三层,则应该打印:

***

*

***

假设存在五层,则应该打印:

*****

***

*

***

*****

以此类推,我们发现,就沙漏上半部分而言,沙漏每层符号数为:1,3,5,7.....,因此推断出整个沙漏的层数与沙漏符号的总数关系如下:假设沙漏第一层为一个沙漏符号,,两层的沙漏共有1+3*2=7个沙漏符号,三层的沙漏拥有1+ 3*2 +5 *2=17个沙漏符号2,则拥有n层的沙漏总共的沙漏符号有1+3*2+5*2+.....+(n-1)*2+n*2个沙漏符号,则统计沙漏所需符号个数的代码段如下:

list1=input().split()#将输入以空格分割
i = 1#定义层数i的初始值为1,为了方便,只统计上半层层数,总层数为2*i -1
sum_ = 1#定义沙漏符号总数的初始值为1
temp=0#临时变量勇于记录每增加一层沙漏时的符号总数
while sum_ <= int(list1[0]):
    i += 1
    sum_ += (4 * i -2)#关键:每次沙漏顶层增加的符号数为 2*i-1,上下两层都增加,则为4 * i -2
    temp = sum_
#打印沙漏所需符号数,由于退出循环时,i增加了1,但真正需要的i为退出循环前一次的i,并且由于i的变化导致sum_也变化
print_sum = temp - (4 * i - 2)
i = i -1#真正的层数
shengyu_sum = int(list1[0]) - print_sum#剩余的符号数

对于打印沙漏,用上python的字符乘以数字为字符重复多少次的特性,加之由上我们不难看出,沙漏由于中间层只有1个符号,但是上下对称,因此我们选择将沙漏分成上下两个层来处理

完整的代码如下:

list1=input().split()
i = 1
sum_ = 1
temp=0
while sum_ <= int(list1[0]):
    i += 1
    sum_ += (4 * i -2)
    temp = sum_
print_sum = temp - (4 * i - 2)
i = i -1
shengyu_sum = int(list1[0]) - print_sum
i_t= i
n = 0#定义n方便打印符号前的空格
#打印上半层
while i_t >= 1:#上半层结束条件
    print(n * " " + (2 * i_t -1) * list1[1])
    i_t -=1
    n += 1
i_t = 1#推出上半层打印时,i_t多减了1,
n = i -2#下半层符号前空格数量的规律
while i_t < i:#下半层打印结束条件
    print(n * " " + (2 * i_t + 1) * list1[1])
    i_t += 1
    n -= 1
print(shengyu_sum)
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐