2

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

给定第 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 的新手,因此非常感谢任何导致成功解决方案的帮助。

谢谢,

4

6 回答 6

5

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

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

于 2011-04-06T12:36:06.780 回答
2

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

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

您可以在 Binet 的公式中以不同的方式保存更多字符:f=lambda n:round((1+5**.5)**n/5**.5/2**n).

于 2011-04-06T12:28:37.430 回答
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()
于 2011-04-06T13:43:45.660 回答
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&
于 2011-04-06T12:30:34.490 回答
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 个字符,只要您不关心 int() 函数并接受浮点数

于 2011-04-06T12:55:59.303 回答
-1

这个打印斐波那契数列直到 n。

def fib(n):    
    a, b = 0, 1
    while a < n:
        print(a, end=' ')
        a, b = b, a+b
        print()
于 2011-10-05T21:14:33.550 回答