鱼C论坛

 找回密码
 立即注册
查看: 8468|回复: 55

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

[复制链接]
发表于 2018-3-18 16:13:14 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 冬雪雪冬 于 2018-3-19 21:12 编辑

我们的玩法做了一下改变:

1. 楼主不再提供答案。
2. 请大家先独立思考,再参考其他鱼油的解答,这样才有助于自己编程水平的提高。开始阶段是看不到其他人的回帖的,等答题完成,开始评分时再取消限制。
3. 鼓励大家积极答题,奖励的期限为出题后24小时内。
4. 根据答案的质量给予1~3鱼币的奖励。

题目:
本题由 @shigure_takimi 提供,有一分数序列:2/1,3/2,5/3,8/5,8/13,21/13...求出这个序列的前20项之和。
以字符串 2/1+3/2+5/3+8/5+13/8+21/13+……= result 的形式返回结果。要求结果保留2位小数。
输出范例:
2/1+3/2+5/3+8/5+13/8+21/13+34/21+55/34+89/55+144/89+233/144+377/233+610/377+987/610+1597/987+2584/1597+4181/2584+6765/4181+10946/6765+17711/10946 = 32.66
提示:很容易看出这是用到了斐波那契数列,可以定义一个函数反复调用,但每次调用都从1开始计算,效率很低,可以采用生成器或直接在主程序中计算。

感谢 @shigure_takimi 提供题目,也希望大家有适宜的题目提供给我们,共同把每日一题这个项目做好。请 @shigure_takimi 多回一帖,给予出题奖励。

要求:
题目难易适度,以python语言的运用为主,算法为辅。
对于提供优质题目的鱼油给予鱼币奖励。
可以发私信给我或直接发帖并@我。

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2018-3-18 17:53:26 From FishC Mobile | 显示全部楼层
本帖最后由 Chase_Kas 于 2018-4-4 20:14 编辑

学完生成器了~~
def fibs():
    a, b = 1, 1
    while True:
        a, b = b, a+b
        yield (a, b)
        
def fun(times):
    sums, i, equation = 0, 1, ''
    for each in fibs():
        if i<times:
            equation += '{0}/{1}+'.format(each[1],each[0])
            sums += (each[1]/each[0])
            i += 1
        else:
            sums += (each[1]/each[0])
            equation += '{0}/{1}={2:.2f}'.format(each[1],each[0],sums)
            break
    print(equation)

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

使用道具 举报

发表于 2018-3-18 18:01:25 | 显示全部楼层
def sum(n):
    if n==1:
        return 1
    if n==2:

        return 2
    else:
        return sum(n-1)+sum(n-2)



sum0 = 0
for i in range(2,22):
    sum1 = sum(i)/sum(i-1)
    sum0 += sum1
    if i == 21:
        print(r'%d/%d='%(sum(i),sum(i-1)),end='')
    else:
        print(r'%d/%d+'%(sum(i),sum(i-1)),end='')

print('%.2f'%sum0)

亲测可行,和要求一样

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-3-18 18:21:09 | 显示全部楼层
谢谢提示。
PS:只能以此拙劣的方式去除最后面的+...
def Fibo_iter(n):
    if n == 'den':
        a, b = 1, 1
    elif n == 'mol':
        a, b = 1, 2
    for i in range(20):
        a, b = b, a + b
        yield a

def main():
    reslut_str = ''
    reslut_int = 0
    denominator = Fibo_iter('den')  #分母
    molecule = Fibo_iter('mol')  #分子
    for i, j in zip(denominator, molecule):
        reslut_int = reslut_int + j / i
        reslut_str += str(j) + '/' + str(i) + '+'
    print(reslut_str[:len(reslut_str)-1],'=',round(reslut_int,2))

if __name__ == '__main__':
    main()

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-3-18 18:53:32 From FishC Mobile | 显示全部楼层
#  领奖咯!
def f(n):
    if n < 1:
        return None
    else:
        fenzi = 2
        fenmu = 1
        s = []
        total = 0
        for i in range(n):
            total += fenzi/fenmu
            s.append(str(fenzi)+'/'+str(fenmu))
            fenzi, fenmu = fenzi+fenmu, fenzi
        return '+'.join(s)+'='+'%.2f' % total

print(f(1))
print(f(20))

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-3-18 19:12:47 | 显示全部楼层
#分母
fm = 1
#分子
fz = 2
result = fz/fm
for i in range(1,20):
    temp = fz
    fz = fm +fz
    fm = temp
    result += fz/fm
    if i == 19: 
        print(str(fz)+"/" +str(fm)+" = "+str(round(result,2)),end=' ')
    else:
        print(str(fz)+"/" +str(fm)+"+",end=' ')

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-3-18 19:23:20 | 显示全部楼层
本帖最后由 阿bang 于 2018-3-18 19:25 编辑
fibo = [1, 2]
for i in range(20):
    fibo.append(fibo[i] + fibo[i + 1])
output_str = ''
result = 0
for j in range(20):
    output_str += str(fibo[j+1]) + '/' + str(fibo[j])
    if j < 19:
        output_str += '+'
    result += float(fibo[j+1]) / fibo[j]
print output_str, '=', '%.2f' % result

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-3-18 19:34:00 | 显示全部楼层
def fib():
    x = 0
    y = 1
    while True:
        x,y = y,x+y
        yield x

list1 = []  #前20项的分子
list2 = []  #前20项的分母
count = 0
result = 0

for each in fib():
    if count > 21:
        break
    else:
        if 0 < count <= 20:
            list2.append(each)
        if 1 < count <= 21:
            list1.append(each)
    count += 1

for i in range(20):
    result += list1[i]/list2[i]
    if i != 19:
        print(str(list1[i]) + '/' + str(list2[i]) + '+',end = '')
    else:
        print(str(list1[i]) + '/' + str(list2[i]) + ' = ',end = '')

print('%.2f' %result)

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-3-18 19:38:48 | 显示全部楼层
EVA
s,a,b=0,1,2
e=''
for i in range(20):
    s+=b/a
    e+=(str(b)+'/'+str(a)+'+')
    a,b=b,a+b
c=e[:-1]
print('%s=%.2f'%(c,eval(c)))

生成器?
def fibs():
    s,a,b,t=0,1,1,0
    while True:
        a,b=b,a+b
        s+=b/a
        t+=1
        yield b,a,s,t
for x in fibs():
    if x[3]<20:
        print('%d/%d+'%x[:2],end='')
    if x[3]==20:
        print('%d/%d=%.2f'%x[:3])
        break

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-3-18 19:59:17 | 显示全部楼层
本帖最后由 Agoni 于 2018-3-18 20:16 编辑
def fab(n):
    f1 = 1
    f2 = 1
    f3 = 0
    for i in range(n):
        f1 = f1 + f2
        f3 = f1 / f2 + f3
        f2 = f1 + f2
        f3 = f2/ f1 + f3
    return '%.2f'  % f3

print(fab(10))

点评

除了结果还要打印算式  发表于 2018-3-19 21:17

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-3-18 20:34:17 | 显示全部楼层
def generate_fib_array(num):  #传入的参数表示求和项数
    fib = [1, 2]

    for i in range(2, num+1):
        fib.append(fib[i-1]+fib[i-2])  #这里一开始写成了fib(i-1),报错'list' object is not callable,该打。
    
    return fib


def cal_frac_sum(fib, num):  #计算分数的和,传入参数为一个菲波那切数列以及求和项数
    __sum = 0

    for i in range(num):
        __sum += fib[i+1]/fib[i]

    return __sum

print('%.2f' % cal_frac_sum(generate_fib_array(20), 20))
 

点评

除了结果还要打印算式  发表于 2018-3-19 21:18

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-3-18 20:34:34 | 显示全部楼层
def new_fib(number):
        deno = []
        deno.append(1)
        deno.append(2)
        for i in range(2,number):
                deno.append(deno[i-1] + deno[i-2])

        nume = []
        nume.append(2)
        nume.append(3)
        for i in range(2,number):
                nume.append(nume[i-1] + nume[i-2])

        result = 0
        for i in range(number):
                result += nume[i]/deno[i]

        for i in range(number):
                print(str(nume[i])+'/'+str(deno[i]),end = '')
                if i+1 == number:
                        break
                else:
                        print('+',end = '')

        print('=%.2f'%result)

if __name__ == '__main__':
        number = int(input('请输入要计算多少位:'))
        new_fib(number)


结果:
请输入要计算多少位:20
2/1+3/2+5/3+8/5+13/8+21/13+34/21+55/34+89/55+144/89+233/144+377/233+610/377+987/610+1597/987+2584/1597+4181/2584+6765/4181+10946/6765+17711/10946=32.66

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-3-18 20:56:41 | 显示全部楼层
水平有限,找个难度适中的题还挺不容易。

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-3-18 21:01:26 | 显示全部楼层
a=1 ; b=2 ; s1=[1,2]
for i in range(2,24):
    s1+=[a+b]
    a=b
    b=s1[i]
s2='' ; s3=0
for i in range(0,20):
    s2+='+'+str(s1[i+1])+'/'+str(s1[i])
    s3+=s1[i+1]/s1[i]
s2=s2[1:]+' = '+'%3.2f'%s3
print(s2)

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-3-18 21:15:59 | 显示全部楼层
def fun_z(n):
    a = 1
    b = 1
    for i in range(n):
        a, b = b, a+b
        yield b

def fun_m(n):
    a = 0
    b = 1
    for i in range(n):
        a, b = b, a+b
        yield b

def main():
    result = 0
    qq = []
    pp = []
    count = 1
    n = ''
    
    for i in fun_z(20):
        qq.append(i)

    for m in fun_m(20):
        pp.append(m)

    for x in range(20):
        result += qq[x]/pp[x]
        n += str(qq[x]) + '/' + str(pp[x]) + '+' 
       

    print('%s = %.2f' %(n[:-2], result))
    
        
    

if __name__ == '__main__':
    main()
    

点评

算式最后17711/1094不对  发表于 2018-3-19 21:19

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-3-18 21:41:52 | 显示全部楼层
本帖最后由 天圆突破 于 2018-3-18 22:44 编辑
def summ(s = 20):
    a, b, string = 1, 1, ''
    for i in range(s):
        a, b = b, a+b
        string+= '%s%s%s%s'%(str(b),'/',str(a),(i!=s-1)*'+')
    return '%s%s%.2f'%(string,' = ',eval(string))
if __name__ == '__main__':
    print(summ(20))

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-3-18 21:43:11 | 显示全部楼层
应该是太复杂了...
#有一分数序列:2/1,3/2,5/3,8/5,8/13,21/13...求出这个序列的前20项之和。
#以字符串 2/1+3/2+5/3+8/5+13/8+21/13+……= result 的形式返回结果。
#要求结果保留2位小数。

#创建一个生成各个分数及其值字典的生成器
def gfs():
    m=2
    n=1
    strkey=str(m)+'/'+str(n)
    jgv=m/n
    mydc={strkey:jgv}
    yield mydc
    while True:
        k=m
        m=m+n
        n=k
        strkey=str(m)+'/'+str(n)
        jgv=m/n
        mydc={strkey:jgv}
        yield mydc

def func(n):
    stest=gfs() 
    prnstr=''
    prnnum=0.00
    counter=0
    while counter<n:
        cn=next(stest)
        if counter==n or counter==0:
            prnstr=prnstr+list(cn.keys())[0]
        else:
            prnstr=prnstr+'+'+list(cn.keys())[0]
        if counter>1 and counter%5==0:
            prnstr=prnstr+'\n'
        prnnum=prnnum+list(cn.values())[0]
        counter=counter+1
    print(prnstr+'=%.2f'% prnnum)
    
func(20)
    
    
    

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-3-18 22:18:34 | 显示全部楼层
def fibo(n):
    if n <= 1:
       return n
    else:
       return(fibo(n-1) + fibo(n-2))
list1=[fibo(i)/fibo(i-1) for i in range(3,23)]
list2=[(str(fibo(i)) + '/' + str(fibo(i-1))) for i in range(3,23) ]
M='+'.join(list2)
N='%.2f' % sum(list1)
print('{}={}'.format(M,N))

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-3-18 23:56:47 | 显示全部楼层
def fun(n):
    str1 = ''
    a = 1
    b = 2
    c = 0
    num = 0
    for i in range(n):
        if i != 0:
            str1 += '+'
        str1 += str(b) + '/' + str(a)
        num += b/a
        c = a + b
        a = b
        b = c
    print('%s' %(str1) ,'=','%.2f' %(num))
fun(20)

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-3-19 08:36:08 | 显示全部楼层
def Fib():
    a, b = 1, 2
    sum = 0
    result = ''
    while True:
        sum += b/a
        result += '%s/%s+' %(b, a)
        a, b = b, a+b
        yield '%s = %0.2f'%(result[:-1], sum)


fib = Fib()
for i in range(19):
    next(fib)
print(next(fib))

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-28 18:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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