藍橋杯-高精度黃金分割數

題目

黃金分割數0.61803… 是個無理數,這個常數十分重要,在許多工程問題中會出現。有時需要把這個數字求得很精確。
對於某些精密工程,常數的精度很重要。也許你聽說過哈勃太空望遠鏡,它首次升空後就發現了一處人工加工錯誤,對那樣一個龐然大物,其實只是鏡面加工時有比頭髮絲還細許多倍的一處錯誤而已,卻使它成了“近視眼”!!
言歸正傳,我們如何求得黃金分割數的儘可能精確的值呢?有許多方法。
比較簡單的一種是用連分數:f(n)=1/(1+f(n-1)) abs(f(n)-f(n-1))<10e-100
(連分數的圖見QQ羣)
這個連分數計算的“層數”越多,它的值越接近黃金分割數。
請你利用這一特性,求出黃金分割數的足夠精確值,要求四捨五入到小數點後100位。
小數點後3位的值爲:0.618
小數點後4位的值爲:0.6180
小數點後5位的值爲:0.61803
小數點後7位的值爲:0.6180340
(注意尾部的0,不能忽略)
你的任務是:寫出精確到小數點後100位精度的黃金分割值。
注意:尾數的四捨五入! 尾數是0也要保留!
顯然答案是一個小數,其小數點後有100位數字。
注意:不要提交解答過程,或其它輔助說明類的內容。

碎碎念

學到了:

  1. 模擬手算法求小數點後100位大數
  2. 斐波那契數列和黃金分割數關心
    沒搞懂:
  3. 一定要f[48]/f[49]嗎?不是f越大越好嗎?
  4. 全網都是一個答案(下面代碼運行出的),但是WA了,找到了一個AC答案但是並不知道爲什麼???而且爲什麼是小數點後99位題目不是要求100位嗎??
  5. WA:0.6180339887498948481971959525508621220510663574518538453723187601229582821971784348083863296133320592
    AC:0.6180339887498948482045868343656381177203091798057628621354486227052604628189024497072072041893911375

代碼

#include<bits/stdc++.h>
#define F 50//只能用f[48]/f[49] ?
using namespace std;
long long f[1000];
int main(){
	f[0] = 0, f[1] = 1;
	int i;
	for(i = 2; f[i-1]<1e18 && i<F; i++){
		f[i] = f[i-1] + f[i-2];
	}
//	printf("%d\n", i);
	unsigned long long int x = f[F-2];
	unsigned long long int y = f[F-1];
//	printf("%lld %lld\n",x, y);
	int t;
	for(int i = 0; i<101; i++){
		t = x/y;
		x = (x%y)*10;
		if(i == 1) printf(".");
		printf("%d", t);
	}
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章