蓝桥杯例题练习(简单)--打印沙漏
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定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)
更多推荐
所有评论(0)