标题: 黄金连分数
    黄金分割数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也要保留!

显然答案是一个小数,其小数点后有100位数字,请通过浏览器直接提交该数字。
注意:不要提交解答过程,或其它辅助说明类的内容。

解题思路:

此题在网上看过若干解法,大同小异,但基本都是错误的。

下面是一种正确解法。

首先,题目所说的黄金连分数实际上就是求解某一项斐波那契数列n/n+1项的比值,要精确到小数点100位。

此题网上解法错误在于大多使用了较小项的斐波那契数,一般在40到70项,实际上,100位精确小数是要做到无误差的,因此必须不断加大斐波那契的项数不断测试,下面我给出一个图,大家就明白了。

实际上这个比值在102项/101项斐波那契数的时候才开始不再变化,即为我们要求的结果。

因此难度在于100多项斐波那契数的时候,我们的整型是无法计算如此大的数据。因此需要通过大数加法以及大数除法实现计算。

下面给出代码:

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
//思路:由黄金连分数可转化为求解斐波那契数,运用大数运算求解小数点后一百位//n表示斐波那契数列第一百项
int n = 100;
int cmp(string a, string b)
{if (a == b) return 0;else if (a.length() < b.length()) return -1;else if (a.length() > b.length()) return 1;else{if (a > b) return 1;if (a < b) return -1;return -1;}
}//大数相加,较大斐波那契数无法算出,只能通过大数计算
string add(string a, string b)
{//去掉开头的0,substr(a,n) 返回第a位开始长度为n的字符串//find_first_not_of("abc")返回最先匹配到abc任意一个字符的最后位置a = a.substr(a.find_first_not_of('0'));b = b.substr(a.find_first_not_of('0'));long long lenA = a.length();long long lenB = b.length();long long len = max(lenA, lenB) + 10;//反转, 便于从最低位逐位求和reverse(a.begin(), a.end());reverse(b.begin(), b.end());string ans(len, '0');for (int i = 0; i < lenA; i++){ans[i] = a[i];}//通过模拟手工计算来进行大数相加,temp用来存储上下两位相加的结果int temp = 0;for (int i = 0; i < len; i++){if (i < lenB){temp += ((ans[i] - '0') + (b[i] - '0'));ans[i] = temp % 10 + '0';temp /= 10;}else{temp += (ans[i] - '0');ans[i] = temp % 10 + '0';temp /= 10;}}//ans存储的结果最后要反转回来去掉开头的0reverse(ans.begin(), ans.end());return ans.substr(ans.find_first_not_of('0'));
}//大数相减
string substract(string a, string b)
{//a必须大于b,实际上在divide()中,a已经>=b了reverse(a.begin(), a.end());reverse(b.begin(), b.end());//将a复制给ansstring ans = a;//依旧是模拟手工减法计算for (int i = 0; i < b.length(); i++){if (ans[i] >= b[i]){ans[i] = ans[i] - b[i] + '0';}//注意:在被减数不够减的情况下,需要向前借位,//可能被借位为0也不够借,继续往前寻找不为0的位,通过一个while循环实现else{int k = 1;while (ans[i + k] == '0'){//0被借位变为9ans[i + k] = '9';k++;}//最终i+k位不为0可以被借-1,i位+10ans[i + k] = ans[i + k] - 1;ans[i] = ans[i] + 10 - b[i] + '0';}}reverse(ans.begin(), ans.end());return ans.substr(ans.find_first_not_of('0'));
}//大数相除
string divide(string a, string b)
{//前提 a < b 实际题目已满足//大数除法实际上是模拟除法运算结合大数减法string ans = "0.";for (int i = 0; i < 101; i++) //保留101项,保证四舍五入{// (a*10)/b = t 不过其中除法用减法substract代替a.append(1,'0');int t = 0;while (cmp(a, b) >= 0){a = substract(a, b);t++;}ans.append(1,t + '0');}return ans;
}
int main()
{//斐波那契数列前两项string a = "1";string b = "1";for (int k = 0; k < 40; k++){//求解斐波那契数列100-140各项与前一项的比值(所谓黄金连分数)for (int i = 3; i < n+k; i++){string temp = b;b = add(a, b);a = temp;}string ans = divide(a, b);cout << 100+k  << "项  " <<ans << endl;}return 0;
}

黄金连分数(斐波那契数列、大数运算)正确解法相关推荐

  1. HDU-A Fibonacci sequence斐波那契数列-大数求和

    问题及代码: /* *Copyright (c)2014,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:Fibonacci.cpp *作 者:单昕昕 *完成日期 ...

  2. 斐波那契数列 python 高阶解法

    斐波那契数列 python 高阶解法 2022.09.27 斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以 ...

  3. 用php递归求fibonacci数列,C++_C语言求Fibonacci斐波那契数列通项问题的解法总结,一:递归实现使用 - phpStudy...

    C语言求Fibonacci斐波那契数列通项问题的解法总结 一:递归实现  使用公式f[n]=f[n-1]+f[n-2],依次递归计算,递归结束条件是f[1]=1,f[2]=1. 二:数组实现  空间复 ...

  4. 斐波那契数列大数的压位c语言,HDU 1568 Fibonacci(大数前4位)

    分析:x=1234567.求其前四位数: log10(x)=log10(1.234567)+6. 所以1.234567=10^(log10(x)-6). 1234 =(int) 10^(log10(x ...

  5. 2018年东北农业大学春季校赛 K wyh的数列【数论/斐波那契数列大数取模/循环节】...

    链接:https://www.nowcoder.com/acm/contest/93/K 来源:牛客网 题目描述 wyh学长特别喜欢斐波那契数列,F(0)=0,F(1)=1,F(n)=F(n-1)+F ...

  6. ACM_无聊者序列(斐波那契数列大数取余(同余)+规律)

    Problem Description: 瓜瓜在玩着由红色和蓝色的大理石做成的玻璃珠,他将n个玻璃珠从左到右排成一个序列叫做无聊者序列.一个非空的红色和蓝色玻璃珠组成的序列是一个无聊者序列.这个序列的 ...

  7. 剑指Offer #07 斐波那契数列(四种解法)| 图文详解

    题目来源:牛客网-剑指Offer专题 题目地址:斐波那契数列 题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0).n<=39 题目解析 ...

  8. 斐波拉契数列的三种解法

    斐波那契数列: f(n)=f(n-1)+f(n-2); n>=2 f(0)=0; f(1)=1; 即有名的兔子繁衍问题. 斐波那契数列共有三种解法,因而写这篇文章总结一下. 1. 递归求解 递归 ...

  9. 【算法】【递归与动态规划模块】斐波那契数列的系列问题解法及递推类型问题的最优解

    目录 前言 问题介绍 解决方案 代码编写 java语言版本 c语言版本 c++语言版本 思考感悟 写在最后 前言 当前所有算法都使用测试用例运行过,但是不保证100%的测试用例,如果存在问题务必联系批 ...

  10. 蒟蒻君的数学学习之路1:斐波那契数列的n种解法

    文章目录 ⭐前言 ⭐一. 递推

最新文章

  1. 【底层原理】四位计算机的原理及其实现
  2. 一个让你敲代码的同时,找回童年乐趣的 IntelliJ 插件
  3. Cocos2d 游戏状态机
  4. 数学本是非常有趣的,只是教科书呈现的方式太死板
  5. B端可视化: 图表设计(2)
  6. centos 中查找文件、目录、内容
  7. 算法测试及对比度进一步增强
  8. 泉金海上航线春节期间航班调整 除夕初一各停航4个班次
  9. VC++6.0下编译xvidcore1.1.0
  10. 从零开始学Java——基础篇
  11. matlab fft 相位,从相位和幅度获取傅立叶变换 – Matlab
  12. IntelliJ IDEA激吗? 活 ——集火吗
  13. 个人项目---音乐视频播放器
  14. 如何快速掌握一门新技术
  15. *Algs4-1.4.26-三点共线-(未解决)
  16. 【雷达与对抗】【2017.06】空中目标的无源雷达探测
  17. 新店速递 | IU酒店带您领略“东方古罗马”
  18. hdu2198 How many elements you must throw out? C语言动态规划题
  19. 【干货】初中数学思维导图
  20. java 动物声音 模拟器

热门文章

  1. Url跳转和伪静态html解决方案
  2. STM32中断分配——抢占优先级与响应优先级
  3. 2020-12-20随笔
  4. 基于webassembly的前端视频编辑器(未写完)
  5. 全国计算机一级上表格怎么做,全国计算机一级考试word表格制作(2003版)
  6. linux命令—文件压缩解压缩
  7. 简单谈谈STM32(一) - 走近嵌入式
  8. 数据库运行sql文件
  9. Reids面试题集合 数据结构+穿透雪崩+持久化+内存淘汰策略+数据库双写+哨兵
  10. LINUX JDK 安装与环境变量设置