Problem25

本文介绍了一种利用数学原理快速求解斐波那契数列中首个超过1000位数的方法,并通过代码实现了两种方案:一种基于数学公式仅需1毫秒,另一种采用递推算法耗时785毫秒。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


1.package com.yao.Algorithms;  
2.  
3.import java.math.BigInteger;  
4.  
5./** 
6. *  
7. * @author shuimuqinghua77 @date 2012-4-26下午02:33:04 
8. * 
9. */  
10.public class Problem25 {  
11.public static void main(String[] args) {  
12.  
13.    /** 
14.     * 下面是运用数学上的方式来破解这个1000位数的难题 
15.     * 只需要1ms 
16.     */  
17.    /** 
18.     * 但是Fibonacci sequence还有一个重要的性质就是 
19.     * an=1/√5 [(1/2+√5/2)^ n-(1/2-√5/2)^n] 
20.     * 
21.     *  
22.     *  还有一个黄金比例的法则 
23.     *  即在较高的序列,两个连续的“斐波纳契数”的序列相互分割 
24.        将接近黄金比例(1.618:1或1:0.618)。 
25.        即 an=1.618*1/√5 [(1/2+√5/2)^ (n-1)-(1/2-√5/2)^(n-1)] 
26.        可以推出 
27.        [√5-(1-√5)/2*√5/1.618]an=(1/2+√5)^(n-1)(√5) 
28.        2边同时取以10为底的对数 
29.        lg(an)=(n-1)lg((1/2+√5))+lg√5-lg√5-(1-√5)/2*√5/1.618] 
30.        当lg(an)>=999时候 也就是an突破1000位的时候 
31.     */  
32.    long  start1=System.currentTimeMillis();  
33.    double five=Math.sqrt(5);  
34.    double   factor1=five-(1-five)/2*five/1.618;  
35.    double  factor2=five;  
36.    double factor3=0.5+five/2;  
37.    double factor4=Math.log10(factor2)-Math.log10(factor1);  
38.    for(int i=2;;i++){  
39.        double lg_an=Math.log10(factor3)*(i-1)+factor4;  
40.        if(lg_an>=999)  
41.        {  
42.            System.out.println("结果是:"+i);  
43.            break;  
44.        }  
45.              
46.    }  
47.    long  end1=System.currentTimeMillis();  
48.    System.out.println(end1-start1+"ms");  
49.      
50.    /** 
51.     * 还有一种比较挫的做法就是使用计算机使用暴力破解  785ms 
52.     */  
53.    long  start=System.currentTimeMillis();  
54.    BigInteger fn=new BigInteger("0");  
55.    BigInteger fn_1=new BigInteger("1");  
56.    BigInteger fn_2=new BigInteger("1");  
57.    int count=2;  
58.      
59.    while(fn.toString().length()!=1000){  
60.        fn=fn_1.add(fn_2);  
61.        fn_2=fn_1;  
62.        fn_1=fn;  
63.        count++;  
64.    }  
65.    System.out.println(count);  
66.    long  end=System.currentTimeMillis();  
67.    System.out.println(end-start+"ms");  
68.}  
69.  
70.}  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值