如何計算斐波那契數列中的第n項有多少位

時間 2021-05-06 19:21:25

1樓:Exception

一律py38招呼:

[(lambda x:len((fib := lambda n:

1 if n < 3 else fib(n-1) + fib(n-2))(x))(n) for n in range(101)]# 零到一百,夠了嗎?不行再改。

2樓:陳炳好

# python3 作者知乎_陳炳好時間複雜度 nwhile1:

a,b,

x=0,

1,int(

input

('第幾位:'

))while

x>0:

a,b,

x=b,

a+b,

x-1print(a

,len

(str(a

)),'位數'

)第100項: 354224848179261915075 ,21 位數

第1000000項: 19532821287077...太長省略...838242546875 ,208988 位數,

用時30秒,急需優化。

# python3 作者知乎_陳炳好時間複雜度 nwhile1:

a,b,

x,u,

v,w=

0,1,

int(

input

('第幾位:'

)),10**9

,10**3

,0while

x>1:

a,b,

x=b,

a+b,

x-1if

a>u:

a,b,

w=a//

v,b//

v,w+

3print

(len

(str(b

))+w,

'位數'

)第1000000項,208988 位數,用時0.2秒。速度還行。

# python3 作者知乎_陳炳好時間複雜度 n# 如果使用快速冪,時間複雜度可降至log(n,2)# 該演算法計算使用浮點數,如果n過大則資料溢位while1:

x=int(

input

('第幾位:'))n

=int

(((0.5

+1.25

**0.5)**

x-(0.5

-1.25

**0.5)**

x)/(

5**0.5))

print(n

)第1000項:209位數

# python3 作者知乎_陳炳好時間複雜度定值cimport

math

while1:

x=int(

input

('第幾位:'

))if

x<5:

n=len(

str(

int(((

0.5+

1.25

**0.5)**

x-(0.5

-1.25

**0.5)**

x)/(

5**0.5)

+0.1

)))else:n

=int(x

*math

.log

(0.5

+1.25

**0.5,10

)-math

.log(5

**0.5,10

)+1)

print(n

,'位數'

)第1000000項,208988 位數,用時0.00002秒。完事。

# python3 作者知乎_陳炳好時間複雜度定值cimport

math

while1:

try:x=

int(

input

(' 第幾項:'

))except

:pass

else:n

=x*math

.log

(0.5

+1.25

**0.5,10

)-0.5*

math

.log(5

,10)if

x<50:

print

(' 第',x

,'項為'

,len

(str

(int(10

**n+0.3

))),

'位數'

,'='

,int(10

**n+0.3

))else:m

=str

(int(n

//1-9

))print

(' 第',x

,'項為'

,int(n

+1),'位數'

,'≈'

,int(10

**(n-

n//1)

*10**9

),'x'

,'10'+m

.replace

("0",""

).replace

("1",""

).replace

("2",""

).replace

("3",""

).replace

("4",""

).replace

("5",""

).replace

("6",""

).replace

("7",""

).replace

("8",""

).replace

("9",""

))第 1000000 項為208988 位數≈1953282128 x 10

3樓:

令斐波那契數列的第n項為 2" eeimg="1"/>,則有我們可以用矩陣快速冪在 的時間複雜度內計算出矩陣的冪。當然這樣做是直接求出第n項的具體的值,這個值的增長速度是指數級的。而我們只想知道它有多少位,所以我們需要稍作修改,定義一種十進位制位的浮點小數,在乙個結構體中用64位浮點數儲存乙個不超過10的值作為尾數,另用乙個64位整數作為階碼。

最後階碼的值+1即為十進位制的位數。

用c++隨便寫了一下。

#include

using

namespace

std;

template

T>inline

Tquickpow(T

x,long

longy);

struct

pdlelseif(

y

elseif(

res.

x>=10)

res.x/=

10.0

,res.y

++;return

res;

}pdl

operator*(

const

pdl&

rhs)

const;if

(res.x

>=10)

res.x/=

10.0

,res.y

++;return

res;}};

struct

mat,

ele[0][

1]=;

ele[1][

0]=,

ele[1][

1]=;

}mat

operator*(

const

mat&

rhs)

const

};template

T>inline

Tunitary

()template

<>inline

matunitary

<>();

res.

ele[1][

0]=,

res.

ele[1][

1]=;

return

res;

}template

T>inline

Tquickpow(T

x,long

longy)

intmain

(int

argc

,char

**argv

)else

return0;

}第1000000項應該有208988位十進位制位。

4樓:

程式設計序啊,跟前沒有裝vs的電腦,就大致說一下思路,以C sharp為例

先寫乙個巢狀函式。用if和return語句把最終的計算結果用tostring函式轉化為字串再呼叫字串函式length

完美,多簡單

不過不保證不會崩

5樓:醬紫君

所謂位數就是常用對數下取整嘛, 所以:

然後隨便化簡一下:

不過說實話100萬也不大, Mathematica 2ms 就能給你算一遍再給你數一遍...

斐波那契數列中,第5n項(n N )都能被5整除嗎?

注意到已經有兩個答主指出了當 整除 時,一定成立。其中有一位答主的證明用了通項公式。這裡給出另乙個更強的結論與其證明 定理 其中 表示最大公約數。定理的證明 時結論顯然成立,因此只需證明 的情形即可。事實上,由第二數學歸納法對 進行歸納,容易證明,當 m eeimg 1 時,另外根據遞推式及Eucl...

用MATLAB怎麼編寫斐波那契數列?

Marcovaldo 1 使用matlab中的fibonacci n 函式 在matlab中fibonacci n 返回第n個斐波那契數 clcclear all 第23項的斐波那契數 the 23 fibonacci 23 X sprintf 第23項的斐波那契數 d the 23 disp X ...

為什麼下面程式遞迴計算斐波那契數列java比c 要快?

c 語言 private static IEnumerable Fibonacci Fibonacci Take 20 很簡單 z root 我是來抖機靈的 高富帥狂公升硬體矮窮矬死改演算法 long fib inta returnf Leo 試下這個 include template class ...