繁体   English   中英

斐波纳契数的总和

[英]Sum of Fibonacci numbers

我在这里找到了这个任务。

给定第i个(1 <= i <= 35)斐波那契数F(i),计算第i个和直到第i + 9个数F(i)+ F(i + 1)+ ... + F(i + 9) )和第i + 246个F(i + 246)的最后一位

我一直在尝试使用python和一些技巧(Binnet的公式和棘手的重复发生)解决此问题:

 f=lambda n:((1+5**.5)**n-(1-5**.5)**n)/(2**n*5**.5)
 exec"n=input();print int(55*f(n)+88*f(n+1)+f(n+6)%10);"*input()

但是我还没有设法将给定的源代码限制为111而我的为115,这提示如何改进我的解决方案?

我是python的新手,因此,如果能获得成功解决方案的任何帮助,将不胜感激。

谢谢,

您是否尝试使用此总和公式?

http://en.wikipedia.org/wiki/Fibonacci_number#Second_identity (“第二身份”)?

f = lambda n,t=5**.5:((1+t)**n-(1-t)**n)/(2**n*t)等,花费8个字符,t=5**.5赢得12:3手5**.5 > t 这样可以节省4个字符,这似乎是您所需要的。

[编辑以纠正错字; 分母是2*n而不是2**n 。]

您可以在Binet的公式上另存一些字符,但又要有所不同: f=lambda n:round((1+5**.5)**n/5**.5/2**n)

这是110解决方案,不过我不得不重写公式,并使用了@Gareth的建议:

p=5**.5
f=lambda n:((1+p)**n-(1-p)**n)/(2**n*p)
exec "n=input();print int(f(n+11)-f(n+1)+f(n+6)%10);"*input()

现在保存另一个符号1​​09(使用n操作并摆脱+11 ):

p=5**.5
f=lambda n:((1+p)**n-(1-p)**n)/(2**n*p)
exec "n=input()+6;print int(f(n+5)-f(n-5)+f(n)%10);"*input()

编辑:一种计算特定数字的新方法,可以保存另外4个符号,并可以避免使用int()

def f(n):exec"a=b=1;"+"a,b=b,a+b;"*(n-1);return a
exec "n=input()+6;print f(n+5)-f(n-5)+f(n)%10;"*input()

抱歉,发布之前我没有正确阅读您的问题。 我很高兴您至少在其中找到了一些用处。


我不了解Python,但是在Mathematica中,它尽可能通用:

f[1] = 1;
f[2] = 1;
f[x_] := f[x] = f[x - 1] + f[x - 2]

t = 0;

n = 35;

For[i = 0, i <= 9, i++, t += f[n + i]]

t += f[n + 246] ~Mod~ 10

或者,在简洁的Mathematica中,仍然不使用Fibonacci函数:

f[1|2]=1;a:f@x_:=a=f[x-1]+f[x-2];Sum[f[#+x],{x,0,9}]+f[#+246]~Mod~10&
p=5**.5
f=lambda n:((1+p)**n-(1-p)**n)/(2**n*p)
exec"n=input();print 55*f(n)+88*f(n+1)+f(n+6)%10;"*input()

只要您不关心int()函数并接受浮点数,则为106个字符

这个将Fibonacci级数打印到n。

def fib(n):    
    a, b = 0, 1
    while a < n:
        print(a, end=' ')
        a, b = b, a+b
        print()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM