首页 > 试题广场 >

打印沙漏(20)

[编程题]打印沙漏(20)
  • 热度指数:20803 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印

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

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

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


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

输入

19 *

输出

*****
 ***
  *
 ***
*****
给个短点的Python代码,纯模拟
计算能打多少行符号,然后存入列表
while True:
    try:
        n, flag = map(str, input().split())
        S = 1
        a = 1
        stores = [flag]
        while S + (a + 2) * 2 < int(n):
            stores.append(stores[-1] + flag * 2)
            a += 2
            S += a * 2
        spaces = 0
        for i in stores[::-1]:
            print(' ' * spaces, end='')
            spaces += 1
            print(i)
        spaces -= 1
        for i in stores[1:]:
            spaces -= 1
            print(' ' * spaces, end='')
            print(i)
        print(int(n) - S)
    except:
        break


编辑于 2020-04-16 19:47:13 回复(0)
import sys

n, ch = sys.stdin.readline().strip().split(' ')
blank = ' '
n = int(n)

d = (n - 1) // 2
d += 1

# 求层数
c = 1
for i in range(1, d // 2 + 1):
    if pow(i, 2) <= d:
        c = i
    else:
        break
if d == 0:
    r = 0
    c = 0
else:
    r = n - (2 * pow(c, 2) - 1)
# 打印上三角
for i in range(1, c+1):
    print((i-1) * blank, end='')
    print((2*(c-i+1) - 1) * ch)

# 打印下三角
for i in range(1, c):
    print((c - 1 - i) * blank, end='')
    print((2 * i + 1) * ch)
print(r)

发表于 2020-02-01 15:18:02 回复(0)
while True:
    try:
        x, s = input().split()
        x = eval(x)
        n = int(((x + 1) / 2) ** (1 / 2))
        m = x - (2 * n ** 2 - 1)
        n -= 1
        for i in range(n, 0, -1):
            print((s * i).rjust(n) + s + (s * i).ljust(n))
        for i in range(n + 1):
            print((s * i).rjust(n) + s + (s * i).ljust(n))
        print(m)
    except: break

编辑于 2019-08-20 14:49:59 回复(0)
# -*- coding:utf-8 -*-

def method():
    n, sign = input().split()
    k = int(((int(n) + 1) / 2.0) ** 0.5)
    result = []
    for i in range(k):
        result.append(' ' * i + sign * (2 * (k - i) - 1) + ' ' * i)
    for i in range(1, k):
        result.append(' ' * (k - i - 1) + sign * (2 * i + 1) + ' ' * (k - i - 1))
    for r in result:
        print(r)
    print(int(n)-2*k**2+1)


if __name__ == '__main__':
    method()
发表于 2019-05-27 20:31:22 回复(0)
a, b = input().split()
a = int(a) - 1
i = 3
num = 0
c=''
while a > 2 * i:
    num += 1
    a = a - 2 * i
    i += 2
num1 = num

for j in range(num):
    if j == 0:
        print(b * (2 * num + 1))
        c = b * (2 * num + 1)
    else:
        print(str(b * (2 * num + 1)).center(len(c)))
    num -= 1
print(b.center(len(c)))
for k in range(num1):
    print((b * (2 * (k + 1) + 1)).center(len(c)))
print(a)

编辑于 2019-03-25 19:20:31 回复(0)
output = ''
number,symbol = map(str,input().split())
Number = int(number)
n = int(((Number+1)/2)**0.5)
for i in range(n):
    for j in range(i):
        output += ' '
    for k in range(2*n-2*i-1):
        output += symbol
    output += '\n'
for i in range(n-1):
    for j in range(n-2-i):
        output += ' '
    for k in range(2*i+3):
        output += symbol
    output += '\n'
remain = Number - 2 * n ** 2 + 1
output += str(remain)
print(output)

发表于 2019-03-08 10:36:44 回复(0)
#python,打印了后面的空格,通过。
try:
    while True:
        tempInput = input().split()
        num = int(tempInput[0])
        sign = tempInput[1]
        maxLen = 1
        cost = 1
        remaining = 0
        while num > cost:     #找出最大长度和剩余个数
            if num>cost+2*(maxLen+2):
                maxLen+=2
                cost+=2*maxLen
            else:
                remaining = num-cost
                break
        for i in range(maxLen//2+1):      #打印到一颗“*”时停,注意边界
            print(" "*i,end="")     #前面的空格数
            print(sign*(maxLen-i*2),end="")  #中间的“*”数
            print(" "*i)                 #我打印了后面的空格,是能通过的
        for i in range(maxLen//2-1,-1,-1): #打印剩下的,符号递增的
            print(" " * i, end="")
            print(sign * (maxLen - i * 2), end="")
            print(" " * i)
        print(remaining)
except Exception:
    pass

编辑于 2018-09-21 18:03:10 回复(0)

python解法 非常之简单

直接把每层的数量求出来放到一个数组里面,遍历这个数组打印就可以了。

a = input().split()
# totalCount是符号的数量(一点一点的减掉) symbol是输入的符号(如*)
totalCount, symbol = int(a[0]) - 1, a[1]
# currentLevelCount是当前层符号的数量(从1,3,5递增)。symbolArray是每层符号的数量。
currentLevelCount, symbolArray = 3, [1]
# 每当可以再加一层,便进行计算。
while totalCount > currentLevelCount * 2:
    totalCount = totalCount - currentLevelCount * 2
    symbolArray.append(currentLevelCount)
    symbolArray.insert(0, currentLevelCount)
    currentLevelCount += 2
for i in symbolArray:
    print(" " * ((symbolArray[0] - i) // 2) + symbol * i)

print(totalCount)
发表于 2018-02-07 11:43:28 回复(1)

问题信息

难度:
8条回答 31354浏览

热门推荐

通过挑战的用户

打印沙漏(20)