• 高精确度——黄金分割数(前100位)


    题目描述:

    黄金分割数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;
    } 
    实现代码
  • 相关阅读:
    大数据概述
    c语言文法
    实验一 词法分析程序实验
    语法分析程序
    第一篇博客~关于编译原理的理解
    《DenseNet Models for Tiny ImageNet Classification》课程设计论文
    物体检测的尺度效应实验
    16路PWM输出的pca9685模块
    Rocketlab公司火箭Electron介绍
    网址图书收藏
  • 原文地址:https://www.cnblogs.com/xieyupeng/p/7093228.html
Copyright © 2020-2023  润新知