⾼精确度——黄⾦分割数(前100位)printf直接输出数字
题⽬描述:
黄⾦分割数 是个⽆理数,这个常数⼗分重要,在许多⼯程问题中会出现。有时需要把这个数字求得很精确。
对于某些精密⼯程,这些的常数的精度很重要。也许你听说过哈勃太空望远镜,它⾸次升空后就发现了⼀处⼈⼯加⼯错误,对那样⼀个庞然⼤物,其实只是镜⾯磨制时有⽐头发丝还细许多倍的⼀处错误⽽已,却使它成了“近视眼”!!
我们如何求得黄⾦分割数的尽可能精确的值呢?有许多⽅法。
⽐较简单的⼀种是⽤连分数:
这个连分数计算的“层数”越多,它的值越接近黄⾦分割数。
请你利⽤这⼀特性,求出黄⾦分割数的⾜够精确值,要求四舍五⼊到⼩数后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=
// 196418/317811=
// 会发现只能精确到⼩数点后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]); //利⽤上⾯的⽅法逐个输出位数
}
return0;
}
实现代码
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论