鱼C论坛

 找回密码
 立即注册
查看: 3825|回复: 13

[技术交流] Python:每日一题 99

[复制链接]
发表于 2017-9-11 18:44:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

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

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

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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))

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-12 00:23:59 | 显示全部楼层
今天没时间去想了,直接进来学习一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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)

点评

打印的行数是d的两倍  发表于 2017-9-12 20:29

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
冬雪雪冬 + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-12 11:10:37 From FishC Mobile | 显示全部楼层
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)

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
冬雪雪冬 + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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)

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
冬雪雪冬 + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

这样没有答案,又看不见别人的想法,根本不知道自己的想法有没有绕弯路啊
考完试不讲试卷,没有进步的啊
我直接建二维数组,然后用圆的方程画的
import numpy as np

def circle(d):
    a = np.fromfunction(lambda x,y: np.hypot(x-d//2, y-d//2), (d,d))
    [print(*i) for i in np.where(a >= d/2, " ", "*")]
这里刚好利用了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()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 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)

微信图片_20170912224207.png

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
冬雪雪冬 + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-12 22:59:52 | 显示全部楼层
我用IDLE打印过,没问题啊。
横向的字符数可设为纵向的2倍。 我是2倍的。
我的参数d是半径。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

在大家答题后一段时间会公开回帖。如果比较复杂的问题会加上讲评,谢谢你的建议。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-13 07:44:24 | 显示全部楼层
bush牛 发表于 2017-9-12 22:59
我用IDLE打印过,没问题啊。
横向的字符数可设为纵向的2倍。 我是2倍的。
我的参数d是半径。

明白了,我是按直径考虑的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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)

#  没有别人画的圆呀。
wxid_mlhj1sszbna021_1512433933021_32.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-19 17:43:37 From FishC Mobile | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-14 02:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表