鱼C论坛

 找回密码
 立即注册
查看: 6690|回复: 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位小数。
输出范例:
  1. 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 编辑

学完生成器了~~
  1. def fibs():
  2.     a, b = 1, 1
  3.     while True:
  4.         a, b = b, a+b
  5.         yield (a, b)
  6.         
  7. def fun(times):
  8.     sums, i, equation = 0, 1, ''
  9.     for each in fibs():
  10.         if i<times:
  11.             equation += '{0}/{1}+'.format(each[1],each[0])
  12.             sums += (each[1]/each[0])
  13.             i += 1
  14.         else:
  15.             sums += (each[1]/each[0])
  16.             equation += '{0}/{1}={2:.2f}'.format(each[1],each[0],sums)
  17.             break
  18.     print(equation)

  19. 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:只能以此拙劣的方式去除最后面的+...
  1. def Fibo_iter(n):
  2.     if n == 'den':
  3.         a, b = 1, 1
  4.     elif n == 'mol':
  5.         a, b = 1, 2
  6.     for i in range(20):
  7.         a, b = b, a + b
  8.         yield a

  9. def main():
  10.     reslut_str = ''
  11.     reslut_int = 0
  12.     denominator = Fibo_iter('den')  #分母
  13.     molecule = Fibo_iter('mol')  #分子
  14.     for i, j in zip(denominator, molecule):
  15.         reslut_int = reslut_int + j / i
  16.         reslut_str += str(j) + '/' + str(i) + '+'
  17.     print(reslut_str[:len(reslut_str)-1],'=',round(reslut_int,2))

  18. if __name__ == '__main__':
  19.     main()
复制代码

评分

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

查看全部评分

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

使用道具 举报

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

  15. print(f(1))
  16. print(f(20))
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-3-18 19:12:47 | 显示全部楼层
  1. #分母
  2. fm = 1
  3. #分子
  4. fz = 2
  5. result = fz/fm
  6. for i in range(1,20):
  7.     temp = fz
  8.     fz = fm +fz
  9.     fm = temp
  10.     result += fz/fm
  11.     if i == 19:
  12.         print(str(fz)+"/" +str(fm)+" = "+str(round(result,2)),end=' ')
  13.     else:
  14.         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 编辑
  1. fibo = [1, 2]
  2. for i in range(20):
  3.     fibo.append(fibo[i] + fibo[i + 1])
  4. output_str = ''
  5. result = 0
  6. for j in range(20):
  7.     output_str += str(fibo[j+1]) + '/' + str(fibo[j])
  8.     if j < 19:
  9.         output_str += '+'
  10.     result += float(fibo[j+1]) / fibo[j]
  11. print output_str, '=', '%.2f' % result
复制代码

评分

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

查看全部评分

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

使用道具 举报

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

  7. list1 = []  #前20项的分子
  8. list2 = []  #前20项的分母
  9. count = 0
  10. result = 0

  11. for each in fib():
  12.     if count > 21:
  13.         break
  14.     else:
  15.         if 0 < count <= 20:
  16.             list2.append(each)
  17.         if 1 < count <= 21:
  18.             list1.append(each)
  19.     count += 1

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

  26. print('%.2f' %result)
复制代码

评分

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

查看全部评分

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

使用道具 举报

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


生成器?
  1. def fibs():
  2.     s,a,b,t=0,1,1,0
  3.     while True:
  4.         a,b=b,a+b
  5.         s+=b/a
  6.         t+=1
  7.         yield b,a,s,t
  8. for x in fibs():
  9.     if x[3]<20:
  10.         print('%d/%d+'%x[:2],end='')
  11.     if x[3]==20:
  12.         print('%d/%d=%.2f'%x[:3])
  13.         break
复制代码

评分

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

查看全部评分

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

使用道具 举报

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

  11. print(fab(10))
复制代码

点评

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

评分

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

查看全部评分

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

使用道具 举报

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

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


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

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

  11.     return __sum

  12. 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 | 显示全部楼层
  1. def new_fib(number):
  2.         deno = []
  3.         deno.append(1)
  4.         deno.append(2)
  5.         for i in range(2,number):
  6.                 deno.append(deno[i-1] + deno[i-2])

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

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

  15.         for i in range(number):
  16.                 print(str(nume[i])+'/'+str(deno[i]),end = '')
  17.                 if i+1 == number:
  18.                         break
  19.                 else:
  20.                         print('+',end = '')

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

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


  25. 结果:
  26. 请输入要计算多少位:20
  27. 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 | 显示全部楼层
  1. def fun_z(n):
  2.     a = 1
  3.     b = 1
  4.     for i in range(n):
  5.         a, b = b, a+b
  6.         yield b

  7. def fun_m(n):
  8.     a = 0
  9.     b = 1
  10.     for i in range(n):
  11.         a, b = b, a+b
  12.         yield b

  13. def main():
  14.     result = 0
  15.     qq = []
  16.     pp = []
  17.     count = 1
  18.     n = ''
  19.    
  20.     for i in fun_z(20):
  21.         qq.append(i)

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

  24.     for x in range(20):
  25.         result += qq[x]/pp[x]
  26.         n += str(qq[x]) + '/' + str(pp[x]) + '+'
  27.       

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

  32. if __name__ == '__main__':
  33.     main()
  34.    
复制代码

点评

算式最后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 编辑
  1. def summ(s = 20):
  2.     a, b, string = 1, 1, ''
  3.     for i in range(s):
  4.         a, b = b, a+b
  5.         string+= '%s%s%s%s'%(str(b),'/',str(a),(i!=s-1)*'+')
  6.     return '%s%s%.2f'%(string,' = ',eval(string))
复制代码

  1. if __name__ == '__main__':
  2.     print(summ(20))
复制代码

评分

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

查看全部评分

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

使用道具 举报

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

  4. #创建一个生成各个分数及其值字典的生成器
  5. def gfs():
  6.     m=2
  7.     n=1
  8.     strkey=str(m)+'/'+str(n)
  9.     jgv=m/n
  10.     mydc={strkey:jgv}
  11.     yield mydc
  12.     while True:
  13.         k=m
  14.         m=m+n
  15.         n=k
  16.         strkey=str(m)+'/'+str(n)
  17.         jgv=m/n
  18.         mydc={strkey:jgv}
  19.         yield mydc

  20. def func(n):
  21.     stest=gfs()
  22.     prnstr=''
  23.     prnnum=0.00
  24.     counter=0
  25.     while counter<n:
  26.         cn=next(stest)
  27.         if counter==n or counter==0:
  28.             prnstr=prnstr+list(cn.keys())[0]
  29.         else:
  30.             prnstr=prnstr+'+'+list(cn.keys())[0]
  31.         if counter>1 and counter%5==0:
  32.             prnstr=prnstr+'\n'
  33.         prnnum=prnnum+list(cn.values())[0]
  34.         counter=counter+1
  35.     print(prnstr+'=%.2f'% prnnum)
  36.    
  37. func(20)
  38.    
  39.    
  40.    
复制代码

评分

参与人数 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 | 显示全部楼层

  1. def Fib():
  2.     a, b = 1, 2
  3.     sum = 0
  4.     result = ''
  5.     while True:
  6.         sum += b/a
  7.         result += '%s/%s+' %(b, a)
  8.         a, b = b, a+b
  9.         yield '%s = %0.2f'%(result[:-1], sum)


  10. fib = Fib()
  11. for i in range(19):
  12.     next(fib)
  13. print(next(fib))
复制代码

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 16:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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