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.62BigDecimal 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+1BigDecimal 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]);elseSystem.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)));//保留小数点后120pre=now;}return now;}
}
`
Java实现斐波那契数列与黄金分割比精确位数问题相关推荐
- java判断斐波那契数列_Java 实例 - 斐波那契数列
Java 实例 - 斐波那契数列 斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597, ...
- 数学之美|斐波那契数列与黄金分割
14天阅读挑战赛 系列文章目录 趣味算法(第二版)读书笔记: day1: 序章|学习的方法和目标. day2:算法之美|打开算法之门与算法复杂性 day3.算法之美|指数型函数对算法的影响实际应用 d ...
- Java实现斐波那契数列Fibonacci
import java.util.Scanner; public class Fibonacci {public static void main(String[] args) {// TODO Au ...
- Think in Java之斐波那契数列
斐波纳契数列(Fibonacci Sequence),又称黄金分割数列. 指的是这样一个数列:1.1.2.3.5.8.13.21.--这个数列从第三项开始,每一项都等于前两项之和. 在数学上,斐波纳契 ...
- 【java】斐波那契数列
开门见山 斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为"兔子数列 ...
- java实现斐波拉契数列
package algorithm.cxg.Fibonacci;import java.util.Scanner;/*** 实现斐波拉切函数* 斐波拉切数列:* 由0和1开始,之后的费波那西系数就由之 ...
- JAVA实现斐波那契数列问题(《剑指offer》)
题目描述: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项. 传说中的斐波那契数列问题,经典中的经典: 做多了基于斐波那契数列问题的变形题目,现在要干撸斐波那契数列,突然 ...
- java解决斐波那契数列(Fibonacci sequence)
斐波那契数列(Fibonacci sequence)的定义:斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610 ...
- Java基础——斐波那契数列问题之兔子不死会有几只兔子
已知:斐波那契数列的前几个数分别为0,1,1,2,3,5-从第三项开始,每一项都等于前两项的和.请接收用户输入的整数n,求出此数列的前n项. 效果如图: 思路:// 0, ...
最新文章
- 一句话总结K均值算法
- 现场总线和工业以太网
- Nginx 提示host not found in upstream 错误解决方法
- JavaScript是如何工作的:使用MutationObserver跟踪DOM的变化
- 小程序 - 学习笔记
- 使用Nuget 安装指定版本package或者更新package到指定版本
- 存储过程实现邮件发送
- (盒子模型常见问题)外边距合并问题,嵌套盒子边距塌陷问题解决
- AD的备份与标准还原:深入浅出Active Directory系列(四)
- 电商大促特辑:蘑菇街致美丽新世界的架构礼
- 应用安全 - 工具使用 - Nmap
- (译)响应式图片— srcset 和 sizes 属性
- 【支付】第三方易宝支付
- 前端学习——Js(JavaScript)入门
- 计算机吴军科学家个人故事,吴军:阅读与写作50讲+吴军个人成长书单
- 哪里有电,哪里就应该有网络 ,华为移动路由Pro评测
- 2016.1云南之旅
- IOS如何发送大文件到QQ
- 【英语阅读】纽约时报 | 你妈注定让你抓狂
- localhost拒绝了我们的连接请求