冬雪雪冬 发表于 2017-9-11 18:44:38

Python:每日一题 99

本帖最后由 冬雪雪冬 于 2017-9-13 07:40 编辑

首先我们的玩法做了一下改变:
1. 楼主不再提供答案。
2. 为了让大家独立思考,跟帖改为“回帖仅作者可见”。
3. 鼓励大家积极答题,奖励的期限为出题后24小时内。
4. 根据答案的质量给予1~3鱼币的奖励。

题目:
在屏幕上用字符显示一个实心圆。
要求编写函数circle(d): d为直径,以行数计算,为方便编程,d使用偶数。考虑到实际显示中字符行间距大于字间距,横向的字符数可设为纵向的2倍。

wc365 发表于 2017-9-11 22:27:17

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))

ChrisYang 发表于 2017-9-12 00:23:59

今天没时间去想了,直接进来学习一下

bush牛 发表于 2017-9-12 09:54:50

本帖最后由 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)

suloman 发表于 2017-9-12 11:10:37

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)

BngThea 发表于 2017-9-12 13:22:34

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)

solomonxian 发表于 2017-9-12 21:14:51

给楼主提个建议:
要不改成多少时间后或者多少楼后公布答案,或者公开大家的回帖,不再奖励

这样没有答案,又看不见别人的想法,根本不知道自己的想法有没有绕弯路啊
考完试不讲试卷,没有进步的啊{: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:40:16

本帖最后由 醉挽丶南风 于 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)

bush牛 发表于 2017-9-12 22:59:52

我用IDLE打印过,没问题啊。
横向的字符数可设为纵向的2倍。 我是2倍的。
我的参数d是半径。

冬雪雪冬 发表于 2017-9-13 07:43:12

solomonxian 发表于 2017-9-12 21:14
给楼主提个建议:
要不改成多少时间后或者多少楼后公布答案,或者公开大家的回帖,不再奖励



在大家答题后一段时间会公开回帖。如果比较复杂的问题会加上讲评,谢谢你的建议。

冬雪雪冬 发表于 2017-9-13 07:44:24

bush牛 发表于 2017-9-12 22:59
我用IDLE打印过,没问题啊。
横向的字符数可设为纵向的2倍。 我是2倍的。
我的参数d是半径。

明白了,我是按直径考虑的。

shigure_takimi 发表于 2017-12-5 10:12:07

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)

#没有别人画的圆呀。

holiday_python 发表于 2021-7-19 17:43:37

看看
页: [1]
查看完整版本: Python:每日一题 99