Java实现斐波那契数列与黄金分割比精确位数问题

题目: 打印输出斐波拉契数列的位数,以及对应的黄金分割值的准确位数,例如(11,4),既是利用11位的斐波拉契数列计算得到的黄金分割数可以准确到小数点后四位。设定一个具体的精确度(例如小数点后10位),当所计算的黄金分割达到该精确度后中断程序,并给出此时斐波拉契数列的位数。

代码实现:

package library;
import java.util.*;
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
public class Fib {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		System.out.print("Please input the digit of the Fibonacci:");
		int num = in.nextInt();
		in.close();
		MathContext mc1 = new MathContext(num, RoundingMode.HALF_DOWN);		//num为精确度得位数,HALF_DOWN表示采取四舍五入,例如0.618 -- 0.62
		BigDecimal sqr_5 = NewtonSqrt(5);
		//System.out.println(sqr_5);
		BigDecimal sub = new BigDecimal("1");
		BigDecimal divisor=new BigDecimal("2");
		BigDecimal Golden_ratio =(sqr_5.subtract(sub)).divide(divisor, mc1);		//按照用户输入的精确度计算所得黄金分割比率,注:末位是真值,不是约分所得,便于后续比较	
		BigDecimal fi[] = new BigDecimal[2];
		BigDecimal precision = new BigDecimal("1").divide(new BigDecimal("10").pow(num));
		//System.out.println(precision);
		System.out.println(precision+"精度下得黄金分割比为:"+Golden_ratio);
		fi[0]=new BigDecimal("1");
		fi[1]=new BigDecimal("1");
		int count = 2;
		while(true) {
			int length=fi.length;
			BigDecimal FI[] = new BigDecimal[length+1];
			for(int i=0;i<length;i++) {
				FI[i]=fi[i];
			}
			FI[length] = fi[length - 1].add(fi[length - 2]);
			fi=FI;     //更新斐波纳契数列
			++count;
			MathContext mc2 = new MathContext(num+1, RoundingMode.DOWN);
			BigDecimal consult = fi[length-1].divide(fi[length], mc2);		//新斐波纳契数列末两位之比,保留精度为小数点后num+1
			BigDecimal SUB = consult.subtract(Golden_ratio);
			if(SUB.compareTo(precision)==-1&&SUB.compareTo(BigDecimal.ZERO)==1)
				    break;
		}
		//输出斐波纳契数列
		for(int i=0;i<fi.length;i++) {
			if(i%10==0 && i!=0)
				System.out.print(" \n\t"+fi[i]);
			else
				System.out.print("\t"+fi[i]+" ");
		}
		System.out.println("\n("+count+","+num+")");
			
		

	}
	static BigDecimal NewtonSqrt(double inC)  //求高精度sqrt(inC),C>1
		{
		    MathContext mc = new MathContext(9999, RoundingMode.HALF_DOWN);//精确度为9999位
			BigDecimal pre=BigDecimal.valueOf(1);//初始值
			BigDecimal now=null;
			BigDecimal C=BigDecimal.valueOf(inC);
			BigDecimal half=BigDecimal.valueOf(0.5);
			for(int i=1;i<=100;i++)             //迭代100次
			{
				now=half.multiply(pre.add(C.divide(pre,mc)));//保留小数点后120
		        pre=now;
			}
			return now;
		}
}

Java实现斐波那契数列与黄金分割比精确位数问题_第1张图片`

你可能感兴趣的:(Java实现斐波那契数列与黄金分割比精确位数问题)