我找到了这个任务here。
给出第i个(1 <= i <= 35)斐波那契 数字F(i)计算总和 ith直到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的新手,所以我们非常感谢能够获得成功解决方案的任何帮助。
谢谢,
答案 0 :(得分:5)
您是否尝试使用此总和公式?
http://en.wikipedia.org/wiki/Fibonacci_number#Second_identity(“第二身份”)?
答案 1 :(得分:2)
f = lambda n,t=5**.5:((1+t)**n-(1-t)**n)/(2**n*t)
等花费8个字符,t=5**.5
获得12:3批5**.5
- &gt; t
。这是一个4个字符的保存,这似乎是你需要的。
[编辑纠正错字;我在分母中有2*n
而不是2**n
。]
你可以在Binet的公式中保存更多不同的字符:f=lambda n:round((1+5**.5)**n/5**.5/2**n)
。
答案 2 :(得分:1)
这是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()
现在保存另一个符号,109(使用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()
答案 3 :(得分:0)
抱歉,在发布之前我没有正确阅读您的问题。我很高兴你至少找到了一些用途。
我不知道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&
答案 4 :(得分:0)
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()
106 chars,只要你不关心int()函数并接受一个浮点数
答案 5 :(得分:-1)
这个将斐波纳契系列打印到n。
def fib(n):
a, b = 0, 1
while a < n:
print(a, end=' ')
a, b = b, a+b
print()