Java 斐波那契数列

斐波那契数列指的是这样一个数列:1、1、2、3、5、8、13、21、34、……

在数学上,斐波那契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n - 1)+F(n - 2)(≥ 3,∈ N*)

也就是第一项等于1,第二项等于1,第三项开始每一项都等于前两项的和。第三项 = 第二项 + 第一项,也就是 1 + 1 = 2;第四项 = 第三项 + 第二项,2 + 1 = 3......以此类推。

我们先定义一个变量存储F(n-1),F(n-2),然后每次累加的时候都改掉它们的值。累计次数达到后,把F(n-1)跟F(n-2)相加起来就得到了F(n)。

        int num = 7;
            
        int a = 1;// F1 F(n-2)
        int b = 1;// F2 F(n-1)
        int c = 2;// F3 F(n)
        
        for(int i = 3;i < num;i ++) {
            
            a = b;
            b = c;

            c = a + b;
            
            System.out.println("第"+(i - 2)+"次循环:(F("+ (i-1) +")="+a+") + (F("+ (i) +")="+b+") = (F("+ (i + 1) +")="+c+")");
            
        }
        
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
        
//      第1次循环:(F(2)=1) + (F(3)=2) = (F(4)=3)
//        第2次循环:(F(3)=2) + (F(4)=3) = (F(5)=5)
//        第3次循环:(F(4)=3) + (F(5)=5) = (F(6)=8)
//        第4次循环:(F(5)=5) + (F(6)=8) = (F(7)=13)
//        5
//        8
//        13

这样我们就可以算出了第7项的斐波那契数是13。

这样子就算是完成的实现。但是还有问题,比如如果我们要求第200项的话,返回结果就成了这个样子。

......
第195次循环:(F(196)=-2021822589) + (F(197)=1163854213) = (F(198)=-857968376) 第196次循环:(F(197)=1163854213) + (F(198)=-857968376) = (F(199)=305885837) 第197次循环:(F(198)=-857968376) + (F(199)=305885837) = (F(200)=-552082539) -857968376 305885837 -552082539

数值是不对的,因为数值太大,超出了int的最大值,数据溢出了。

int的取值范围为(-2147483648~2147483647)

我们这里使用BigInteger进行计算,在 Java中 用来做大数操作的一个类 —— BigInteger类。关于 BigInteger类可以看看https://blog.csdn.net/qq_40893056/article/details/82686266

        int num = 200;
        
        BigInteger a = new BigInteger(String.valueOf(1));// F1 F(n-2)
        BigInteger b = new BigInteger(String.valueOf(1));// F2 F(n-1)
        BigInteger c = new BigInteger(String.valueOf(2));// F3 F(n)
        
        for(int i = 3;i < num;i ++) {
            
            a = b;
            b = c;

            c = a.add(b);
            
            System.out.println("第"+(i - 2)+"次循环:(F("+ (i-1) +")="+a.toString()+") + (F("+ (i) +")="+b.toString()+") = (F("+ (i+1) +")="+c.toString()+")");
            
        }
        
        System.out.println(a.toString());
        System.out.println(b.toString());
        System.out.println(c.toString());
        
//        第195次循环:(F(196)=40934782466626840596168752972961528246147) + (F(197)=66233869353085486281758142155705206899077) = (F(198)=107168651819712326877926895128666735145224)
//        第196次循环:(F(197)=66233869353085486281758142155705206899077) + (F(198)=107168651819712326877926895128666735145224) = (F(199)=173402521172797813159685037284371942044301)
//        第197次循环:(F(198)=107168651819712326877926895128666735145224) + (F(199)=173402521172797813159685037284371942044301) = (F(200)=280571172992510140037611932413038677189525)
//        107168651819712326877926895128666735145224
//        173402521172797813159685037284371942044301
//        280571172992510140037611932413038677189525

现在数值能够正确的显示出来了。

 

posted @ 2020-03-13 14:59  盛夏荼靡  阅读(1748)  评论(0编辑  收藏  举报