题目描述:
黄金分割数0.61823... 是个无理数,这个常数十分重要,在许多工程问题中会出现。有时需要把这个数字求得很精确。
对于某些精密工程,这些的常数的精度很重要。也许你听说过哈勃太空望远镜,它首次升空后就发现了一处人工加工错误,对那样一个庞然大物,其实只是镜面磨制时有比头发丝还细许多倍的一处错误而已,却使它成了“近视眼”!!
我们如何求得黄金分割数的尽可能精确的值呢?有许多方法。
比较简单的一种是用连分数:
这个连分数计算的“层数”越多,它的值越接近黄金分割数。
请你利用这一特性,求出黄金分割数的足够精确值,要求四舍五入到小数后100位。
小数后3位的值为:0.618
小数后4位的值为:0.6180
小数后5位的值为:0.61803
小数后7位的值为:0.6180340
(注意尾部的0)
你的任务是写出小数后100位精度的黄金分割值。
#include<iostream> #include<cmath> #include<cstdio> using namespace std; long long a[100],b[101]; long long f(int n){ if(a[n]!=0) return a[n]; if(n==1||n==2) return a[0]=a[1]=1; else{ a[n-1]=f(n-1); a[n-2]=f(n-2); return a[n-1]+a[n-2]; } } int main(){ double c=1; f(80); //使用50项的精度 问题是为什么是要选50位? // 如果选用fibonacci数列中较大的三个值计算,例如: // 121393/196418=0.618033988738... // 196418/317811=0.618033988754... // 会发现只能精确到小数点后10位 // 所以需要很大的整数(50位左右)相除,才能达到小数点后100位的精度 unsigned long long int x = a[50 - 2]; unsigned long long int y = a[50 - 1]; for(int i = 0; i < 101; i++) { // cout << x << " "<< y <<" "; //模拟手算 例如8除13 0 第一位存入数组并输出 余数是8 8*10再进行下一次手算 //然后要8*10再进行除法 那就是 13/80 =6 第二位存入数组 余数继续 2*10 //再进行20/13 等于1 余数又*10 ........ 实在不理解 直接在纸上进行计算就明白了 a[i] = x / y; x = (x % y) * 10; printf("%d", a[i]); //利用上面的方法逐个输出位数 } return 0; }