Python:每日一题 99
本帖最后由 冬雪雪冬 于 2017-9-13 07:40 编辑首先我们的玩法做了一下改变:
1. 楼主不再提供答案。
2. 为了让大家独立思考,跟帖改为“回帖仅作者可见”。
3. 鼓励大家积极答题,奖励的期限为出题后24小时内。
4. 根据答案的质量给予1~3鱼币的奖励。
题目:
在屏幕上用字符显示一个实心圆。
要求编写函数circle(d): d为直径,以行数计算,为方便编程,d使用偶数。考虑到实际显示中字符行间距大于字间距,横向的字符数可设为纵向的2倍。
def circle(d):
list_x = [(int((d**2 - y**2)**0.5+0.5))*2 for y in range(0,d,2)]
list_x = sorted(list_x) + list_x
for i in list_x:
print(('*'*i).center(d*2)) 今天没时间去想了,直接进来学习一下 本帖最后由 bush牛 于 2017-9-12 09:55 编辑
import math
def circle(d):
x = []
for y in range(d):
x.append(round(2*math.sqrt((d)**2 - (y)**2)))
for i in x[::-1]:
print(' '*(2*d-i)+'*'*i*2)
for i in x:
print(' '*(2*d-i)+'*'*i*2) def circle(d):
a=0.5
for i in range(d):
c=int((((d/2)**2-(d/2-a)**2)**(1/2))*2+0.4)
x=" "*int((d-c))
y="*"*c*2
a+=1
print(" ",x,y)
circle(14) import math
def circle(d):
r = d//2
# top semi-circl
for i in range(1,r + 1):
ns = int(math.sqrt(2 * r * i - i * i))
stars = '*' * (ns * 2 + 1) * 2
nb = 2* (2 * r - ns)
blanks = ' ' * nb
print(blanks + stars)
#bottom semi-circl
for i in range(r + 1,0,-1):
ns = int(math.sqrt(2 * r * i - i * i))
stars = '*' * (ns * 2 + 1) * 2
nb = 2* (2 * r - ns)
blanks = ' ' * nb
print(blanks + stars)
circle(40) 给楼主提个建议:
要不改成多少时间后或者多少楼后公布答案,或者公开大家的回帖,不再奖励
这样没有答案,又看不见别人的想法,根本不知道自己的想法有没有绕弯路啊
考完试不讲试卷,没有进步的啊{:10_245:}
我直接建二维数组,然后用圆的方程画的
import numpy as np
def circle(d):
a = np.fromfunction(lambda x,y: np.hypot(x-d//2, y-d//2), (d,d))
这里刚好利用了print()打印隔开字符的空格,
如果要做成楼主那种实心的,就在打印上动手脚
import numpy as np
def circle(d):
a = np.fromfunction(lambda x,y: np.hypot(x-d//2, y-d//2), (d+1,d+1))
for i in np.where(a > d/2, " ", "*"):
for j in i:
print(2*j, sep="", end="")
print() 本帖最后由 醉挽丶南风 于 2017-9-12 22:42 编辑
import math
def fun(n):
content = []
n=n//2
for y in range(1,n+1):
lenght=int(math.sqrt(n**2-(n-y)**2))
subcontent = []
for a in range(2*(n-lenght)):
subcontent.append(' ')
for b in range(4*lenght):
subcontent.append('*')
for a in range(2*(n-lenght)):
subcontent.append(' ')
content.append(''.join(subcontent))
content.append('\n')
for y in range(n+1,1,-1):
lenght=int(math.sqrt(n**2-(n-y)**2))
subcontent = []
for a in range(2*(n-lenght)):
subcontent.append(' ')
for b in range(4*lenght):
subcontent.append('*')
for a in range(2*(n-lenght)):
subcontent.append(' ')
content.append(''.join(subcontent))
content.append('\n')
print(''.join(content))
fun(40)
我用IDLE打印过,没问题啊。
横向的字符数可设为纵向的2倍。 我是2倍的。
我的参数d是半径。 solomonxian 发表于 2017-9-12 21:14
给楼主提个建议:
要不改成多少时间后或者多少楼后公布答案,或者公开大家的回帖,不再奖励
在大家答题后一段时间会公开回帖。如果比较复杂的问题会加上讲评,谢谢你的建议。 bush牛 发表于 2017-9-12 22:59
我用IDLE打印过,没问题啊。
横向的字符数可设为纵向的2倍。 我是2倍的。
我的参数d是半径。
明白了,我是按直径考虑的。 def circle(d):# d为直径,以行数计算
for y in range(0, d):
x = int(4 * int(((d//2)**2 - (y-d//2)**2)**0.5 + 0.5)) # *个数
x1 = d - x//2 #空格数
print(' '*x1 + '*'*x)
circle(40)
#没有别人画的圆呀。
看看
页:
[1]