2011-04-06 174 views
2

我發現這個任務here斐波納契數的和

鑑於第i個(1 < = I < = 35)斐波那契 數F(ⅰ)計算 第i直到1 +第九數目的總和 F(ⅰ)+ F(I + 1)+ ... + F(1 + 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,因此任何形式的導致一個成功的解決方案的幫助將非常感激。

感謝,

+1

Upvote for Sphere Online Judge。我喜歡那個網站。 – 2011-04-06 11:52:05

+0

@yock:的確,SPOJ太棒了! – Quixotic 2011-04-06 12:25:01

回答

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]

您可以保存幾個字符與比奈的配方不同的扭曲:f=lambda n:round((1+5**.5)**n/5**.5/2**n)

0

對不起,我沒有發佈之前正確讀取你的問題。我很高興你至少在其中找到了一些用處。


我不知道Python,但在數學,儘可能通用爲:

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 

或者,在簡潔的數學,還沒有使用Fibonacci功能:

f[1|2]=1;a:[email protected]_:=a=f[x-1]+f[x-2];Sum[f[#+x],{x,0,9}]+f[#+246]~Mod~10& 
+0

問題是如何讓他已經工作的Python代碼小於111字節。 – 2011-04-06 12:32:29

+0

在Mathematica中,我寧願使用'Fibonacci []'但+1,因爲我在使用'〜Mod〜' – Quixotic 2011-04-06 12:33:11

+0

-1時學到了一些新東西,這顯然不適用於這個問題。 – Exelian 2011-04-06 12:35:10

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()函數,並接受一個浮動

1

這裏是110的解決方案,我不得不雖然改寫公式,並使用@加雷思的建議:

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() 
-1

這一個打印斐波納契數列直到n。

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

它是如何與斐波那契的總和? – 2017-04-22 15:12:55