zoukankan      html  css  js  c++  java
  • 蓝桥杯 黄金连分数(BigDecimal的使用)


    标题: 黄金连分数


    黄金分割数0.61803... 是个无理数,这个常数十分重要,在许多工程问题中会出现。有时需要把这个数字求得很精确。

    对于某些精密工程,常数的精度很重要。也许你听说过哈勃太空望远镜,它首次升空后就发现了一处人工加工错误,对那样一个庞然大物,其实只是镜面加工时有比头发丝还细许多倍的一处错误而已,却使它成了“近视眼”!!


    言归正传,我们如何求得黄金分割数的尽可能精确的值呢?有许多方法。

    比较简单的一种是用连分数:

    这个连分数计算的“层数”越多,它的值越接近黄金分割数。

    请你利用这一特性,求出黄金分割数的足够精确值,要求四舍五入到小数点后100位。

    小数点后3位的值为:0.618
    小数点后4位的值为:0.6180
    小数点后5位的值为:0.61803
    小数点后7位的值为:0.6180340
    (注意尾部的0,不能忽略)

    你的任务是:写出精确到小数点后100位精度的黄金分割值。

    注意:尾数的四舍五入! 尾数是0也要保留!

    显然答案是一个小数,其小数点后有100位数字,请通过浏览器直接提交该数字。
    注意:不要提交解答过程,或其它辅助说明类的内容。

     

     注意:由于黄金分割数是无限小数,所以在使用BigDecimal的除法时,要对结果进行精度的限制,否则BigDecimal的结果对象将是无限位的小数,导致报错。

        连分数的层数设置的大一点,一开始设置100,之后设置200,逐步设置,直到答案不再变化为止(保证100位的精确度)。以下两个程序都是直接设置的1000.

     法一:递归

     1 public class Demo {
     2 
     3     static BigDecimal bd = BigDecimal.ONE;
     4 
     5     public static void main(String[] args) {
     6         System.out.println(f(1000).setScale(100, BigDecimal.ROUND_HALF_UP));
     7     }
     8 
     9     public static BigDecimal f(int x) {
    10         if (x == 1)
    11             return bd;
    12         else
    13             return bd.divide(bd.add(f(x - 1)), 200, BigDecimal.ROUND_HALF_UP);
    14 
    15     }
    16 
    17 }

    法二: 循环

     1 public class Demo {
     2 
     3         public static void main(String[] args) {  
     4             BigDecimal bd = new BigDecimal(1);  
     5             for (int i = 0; i < 1000; i++) {    
     6                 bd = BigDecimal.ONE.add(bd);  
     7                 bd = BigDecimal.ONE.divide(bd, 200, BigDecimal.ROUND_HALF_UP);  
     8             }  
     9             System.out.println(bd.setScale(100, BigDecimal.ROUND_HALF_UP));  
    10          
    11         }  
    12 
    13 }

    这个题用到了java的小数类 BigDecimal。这个类有一些方法需要记录。

     

    1,有加减乘除的方法,分别是add, substract,multiply,divide.他们的参数都是Bigdecimal类型的字符串。

    2,有BigDecimal类型的常数, 例如BigDecimal.ONE。

    3,将一个数字或者字符串转化成BigDecimal格式的数字,只需要使用传进它的构造方法就可以了。

          BigDecimal abig=new BigDecimal(10.0);

    4,BigDecimal有一个设置数字精度的方法,setScale,在要求精度的比赛中经常用到。他有两个参数:

       第一个是数字,表示小数点后面要精确的位数, 第二个是舍入的方式。

       sum.setScale(100, BigDecimal.ROUND_HALF_UP)。

    5,关于舍入方式,有以下:

        BigDecimal.ROUND_HALF_UP    这个是经常用到的,需要记住,就是经常使用的四舍五入。

        BigDecimal.ROUND_HALF_DOWN  四舍六入。

        BigDecimal.ROUND_HALF_EVEN    四舍六入,如果是五,分两种情况,如果前一位是奇数,则入位,否则舍去。

     

  • 相关阅读:
    AtCoder Beginner Contest 205
    Codeforces Round #725 (Div. 3)
    Educational Codeforces Round 110 (Rated for Div. 2)【A
    Codeforces Round #722 (Div. 2)
    AtCoder Beginner Contest 203(Sponsored by Panasonic)
    AISing Programming Contest 2021(AtCoder Beginner Contest 202)
    PTA 520 钻石争霸赛 2021
    Educational Codeforces Round 109 (Rated for Div. 2)【ABCD】
    AtCoder Beginner Contest 200 E
    Educational Codeforces Round 108 (Rated for Div. 2)【ABCD】
  • 原文地址:https://www.cnblogs.com/FengZeng666/p/10555132.html
Copyright © 2011-2022 走看看