java斐波那契算法代码简单实现的三种方式的性能比较

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class asd {

    public static void main(String[] args) {
        Long t1=new Date().getTime();
        BigDecimal b1 = new BigDecimal(1);//初次参数分母
        BigDecimal b2 = new BigDecimal(1);//不变的分子
        List<BigDecimal> BD=new ArrayList<BigDecimal>();
        BD.add(b1);
        for(int i=0;i<10000;i++){//多次执行,使结果更精确
            //将 (1+1/1) 当作一个对象存到一个集合,每次循环都执行1+(1/上次的对象),然后将这个结果转成新的对象放到集合中
            BD.add(b2.divide(((BD.get(BD.size()-1)).divide(b2)).add(b2),110,BigDecimal.ROUND_DOWN));
        }
        System.out.println((BD.get(BD.size()-1)).setScale(100,BigDecimal.ROUND_DOWN));//设置最后的精确小数点的位数100位
        Long t2=new Date().getTime();
        System.out.println("方法一总用时:"+(t2-t1));
        System.out.println();






        Long ts1=new Date().getTime();
        BigDecimal cZ1 = new BigDecimal(1);//初次参数分子
        BigDecimal cM2 = new BigDecimal(2);//初次参数分母
        List<BigDecimal> BDZ=new ArrayList<BigDecimal>();//分子序列
        List<BigDecimal> BDM=new ArrayList<BigDecimal>();//分母序列
        BDZ.add(cZ1);
        BDM.add(cM2);
        for(int i=0;i<10000;i++){
            BigDecimal upCZ1,upCM1;//历史次序
            if(BDZ.size()==1){
                upCZ1=new BigDecimal(1);
                upCM1=new BigDecimal(1);
            }else{
                upCZ1=BDZ.get(BDZ.size()-2);
                upCM1=BDM.get(BDM.size()-2);
            }
            BDZ.add(upCZ1.add(BDZ.get(BDZ.size()-1)));
            BDM.add(upCM1.add(BDM.get(BDM.size()-1)));
        }
        System.out.println((BDZ.get(BDZ.size()-1)).divide((BDM.get(BDM.size()-1)),100,BigDecimal.ROUND_DOWN));
        Long ts2=new Date().getTime();
        System.out.println("方法二用时:"+(ts2-ts1));
        System.out.println();







        Long t3=new Date().getTime();
        BigInteger firstNum = BigInteger.ONE;//1
        BigInteger secNum = BigInteger.ONE;
        BigInteger res = BigInteger.ZERO;//0
        BigInteger TEN = BigInteger.TEN;//10
        //BigInteger的斐波那契数列
        for (int i = 0; i < 10000; i++) {
            if (i == 0 || i == 1) {
                res = BigInteger.ONE;
            }
            res = secNum.add(firstNum); //两个BigInteger相加
            firstNum = secNum;
            secNum = res;
        }
        System.out.print("0.");
        //for循环实现了模拟手算除法
        for (int i = 0; i < 101; i++) {
            //选择斐波那契里两个连续的数,小的做被除数,大的做除数
            //每一位是两者的商值
            BigInteger ans = firstNum.divide(secNum);
            //除数不变,被除数=余数*10
            firstNum = (firstNum.mod(secNum)).multiply(TEN);
            if (i!=0) {  //只输出后面的100位小数点
                System.out.print(ans);
            }
        }
        System.out.println();
        Long t4=new Date().getTime();
        System.out.println("方法三总用时:"+(t4-t3));
    }
}
结果
0.6180339887498948482045868343656381177203091798057628621354486227052604628189024497072072041893911374
方法一总用时:90

0.6180339887498948482045868343656381177203091798057628621354486227052604628189024497072072041893911374
方法二用时:18

0.6180339887498948482045868343656381177203091798057628621354486227052604628189024497072072041893911374
方法三总用时:14

猜你喜欢

转载自blog.csdn.net/yuyixing101082/article/details/80598271
今日推荐