2013藍橋杯省賽JAVA“黃金分割數”分析重點及代碼(大數類API)

1.題目

標題: 黃金連分數
黃金分割數0.61803... 是個無理數,這個常數十分重要,在許多工程問題中會出現。有時需要把這個數字求得很精確。
對於某些精密工程,常數的精度很重要。也許你聽說過哈勃太空望遠鏡,它首次升空後就發現了一處人工加工錯誤,對那樣一個龐然大物,其實只是鏡面加工時有比頭髮絲還細許多倍的一處錯誤而已,卻使它成了“近視眼”!!
言歸正傳,我們如何求得黃金分割數的儘可能精確的值呢?有許多方法。
比較簡單的一種是用連分數:
                     1

黃金數 = ---------------------
                        1
             1 + -----------------
                          1
                 1 + -------------
                            1
                     1 + ---------
                          1 + ...
這個連分數計算的“層數”越多,它的值越接近黃金分割數。
請你利用這一特性,求出黃金分割數的足夠精確值,要求四捨五入到小數點後100位。
小數點後3位的值爲:0.618 小數點後4位的值爲:0.6180 小數點後5位的值爲:0.61803 小數點後7位的值爲:0.6180340 (注意尾部的0,不能忽略)
你的任務是:寫出精確到小數點後100位精度的黃金分割值。
注意:尾數的四捨五入! 尾數是0也要保留!
 

二、思路

1.化簡

2.代碼

本題注意的點:1.轉化爲求斐波那契數列相鄰兩項的比值
2.到多少項?越多越精確。但應該保證n/n+1項,n再往上加,這個比值的小數點後101位是穩定的。嘗試到100個數,兩百個數..直到穩定。
3.double無法精確的100位;BigInteger和BigDemical

package shengsai;

import java.math.BigDecimal;
import java.math.BigInteger;

	


//知識點1.轉化爲求斐波那契數列相鄰兩項的比值
//2.到多少項?越多越精確。但應該保證n/n+1項,n再往上加,這個比值的小數點後101位是穩定的
//3.double無法精確的100位;BigInteger和BigDemical
public class lianfenshu04 {
	public static void main(String args[])
	{
		BigInteger  a=BigInteger.ONE;
	BigInteger b=BigInteger.ONE;
	for(double i=3;i<400;i++)
	{
		
		BigInteger t=b;
		b=a.add(b);
		a=t;
	}
   BigDecimal divide =new BigDecimal(a,110).divide(new BigDecimal(b,110),BigDecimal.ROUND_HALF_DOWN);
	System.out.println(divide.toPlainString().substring(0,103));
	
	
	
	}
}

三、相關知識點(大數類)

摘要:

java中的基礎數據類型能存儲的最大的二進制數是 2 ^ 63 - 1,
對應的十進制數是9223372036854775807,也就是說只要運算過程中會超過這個數,就會造成數據溢出,從而造成錯誤.

  1.     而java.math.*包中提供了大數類,其理論上可以存儲無限位的大數,只要內存足夠的話。
  2.     大數類又分爲整數和浮點數.即BigInteger and BigDecimal
  3.     大數類的對象不能直接進行運算,需要調用類中相應的方法,並且方法的參數必須和調用的類相同,BigInteger不能調用BigDecimal, 不能作爲其方法參數, 即整數和浮點數不能混合運算.

————————————————
版權聲明:本文爲CSDN博主「Androids_lost_Sheep」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/GD_ONE/article/details/103951501

1. 構造、創建

BigInteger 和 BigDecimal

1.直接聲明 
BigInteger a;
BigDecimal b;
2.使用構造函數初始化
BigInteger a = new BigInteger("1");
BigDecimal b = new BigDecimal("12");

2.賦值

1.BigInteger.valueOf(long val);
BigDecimal.valueOf(double val);

2.使用 = 將同類型變量的值賦給另一個變量

BigInteger a=new BigInteger("1");

BigInteger b=new BigInteger("2");

a=b;

System.out.print(a);

3.加減乘除等運算

 (1)加法

BigInteger.add(BigInteger);
BigDecimal.add(BigDecimal);

BigInteger a, b, c;
a = BigInteger.valueOf(123456789); // 賦值爲 123456789
b = BigInteger.valueOf(987654321); // 賦值爲 987654321
c = a.add(b);
System.out.print(c);
輸出:
1111111110 
1111111110 

(2)減法 

BigInteger.subtract(BigInteger);
BigDecimal.sbutract(BigDecimal);

BigInteger a, b, c;
a = BigInteger.valueOf(123456789); // 賦值爲 123456789
b = BigInteger.valueOf(987654321); // 賦值爲 987654321
c = a.subtract(b);
System.out.print(c);

輸出:864197532

 (3)乘法

BigInteger.multiply(BigInteger);
BigDecimal.multiply(BigDecimal);

(4)除法

BigInteger.multiply(BigInteger);
BigDecimal.multiply(BigDecimal);

(5)取餘

BigInteger.mod(BigInteger);

(6)求最大公約數

BigInteger.gcd(BigInteger);

(7)最值

BigInteger.max(BigInteger) , BigDecimal.max(BigDecimal) 最大值
BigInteger.min(BigInteger) , BigDecimal.min(BigDecimal) 最小值

(8)比較大小

BigInteger.compareTo(BigInteger);
BigDecimal.compareTo(BigDecimal);

>輸出1

=輸出0

<輸出-1

4.BigDemical精確度問題

ROUND_DOWN 向零舍入。 即1.55 變爲 1.5 , -1.55 變爲-1.5
ROUND_CEILING 向正無窮舍入. 即 1.55 變爲 1.6 , -1.55 變爲 -1.5
ROUND_FLOOR 向負無窮舍入. 即 1.55 變爲 1.5 , -1.55 變爲 -1.6
ROUND_HALF_UP 四捨五入 即1.55 變爲1.6, -1.55變爲-1.6
ROUND_HALF_DOWN 四捨五入,向下取,即 1.55 變爲 1.5, -1.5變爲-1.5
ROUND_HALF_EVEN 如果舍入前一位的數字爲偶數,則採用HALF_DOWN ;奇數則採用HALF_UP 如:1.55 採用HALF_UP 1.45:採用HALF_DOWN
ROUND_UP 向遠離0的方向舍入 即 1.55 變爲 1.6 , -1.55 變爲-1.6
ROUND_UNNECESSARY 有精確的位數時,不需要舍入

5.保留位數

new BigDecimal(b,110)//是值,110指保留的位數

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章