• C++ 洛谷题 · P1720 斐波那契数列


    题目链接:P1720

    题目描述

    吃完 pizza,月落乌啼知道超出自己的预算了。为了不在爱与愁大神面前献丑,只好还是硬着头皮去算钱……

    当爱与愁大神问多少钱时,月落乌啼说了一堆乱码。爱与愁大神说:“算了算了,我只问第 n n n 样菜价格多少?”月落乌啼写出了:

    F n = ( 1 + 5 2 ) n − ( 1 − 5 2 ) n 5 F_n=\dfrac{(\frac{1+\sqrt{5}}{2})^n-(\frac{1-\sqrt{5}}{2})^n}{\sqrt{5}} Fn=5 (21+5 )n(215 )n

    由于爱与愁大神学过编程,于是就用 1 1 1 分钟的时间求出了 F n F_n Fn 的结果。月落乌啼为此大吃一惊。你能学学爱与愁大神求出 F n F_n Fn 的值吗?

    输入格式

    一行一个自然数 n n n

    输出格式

    只有 1 1 1 行一个实数 F n F_n Fn,保留两位小数。

    样例输入 #1

    6
    
    • 1

    样例输出 #1

    8.00
    
    • 1

    提示

    对于所有数据: 0 ≤ n ≤ 48 0 \leq n\leq 48 0n48

    代码实现

    看到那个牛bee的公式了吗?
    F n = ( 1 + 5 2 ) n − ( 1 − 5 2 ) n 5 F_n=\dfrac{(\frac{1+\sqrt{5}}{2})^n-(\frac{1-\sqrt{5}}{2})^n}{\sqrt{5}} Fn=5 (21+5 )n(215 )n

    如果采用化简的方法,显然是 太笨了 太麻烦了

    与其自己算,我们何不让程序帮我们算呢

    于是,代码如下:

    #include 
    using namespace std;
    
    int main ()
    {
    	int n;
    	cin>>n;
    	double k=pow((1+sqrt(5))/2,n); //左上角求和
    	double f=pow((1-sqrt(5))/2,n); //右上角
    	double ans=(k-f)/(sqrt(5)); //除以根号5
    	cout<<fixed<<setprecision(2)<<ans; //输出!
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    还可以用函数解:

    #include 
    using namespace std;
    double ans(int n){
    	double k=pow((1+sqrt(5))/2,n); //左上角求和
    	double f=pow((1-sqrt(5))/2,n); //右上角
    	double ans=(k-f)/(sqrt(5)); //除以根号5
    	return ans; //返回答案
    }
    int main ()
    {
    	int n;
    	cin>>n;
    	cout<<fixed<<setprecision(2)<<ans(n);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    两种方法都能过
    test
    很完美,对吧?

    直到我看到了百度上的一张图:

    test
    原来,人家是有化简公式的!
    F n = F ( n − 1 ) + F ( n − 2 ) F_n=F(n-1)+F(n-2) Fn=F(n1)+F(n2)

    于是,又出现了一种方法…

    #include 
    using namespace std;
    long long a=1,b=1,c=0,n; //千万不能开int,开int 80分等你(数据会超int)
    /*
    a是第一个数,b是第二个数(跟在a后面),c求出第三个数
    */
    int main ()
    {
    	cin>>n; //输入
    	for(int i=3;i<=n;i++){ //反复执行,由于前两个数已经有了(a和b),所以从3开始
    		c=a+b; //求出下一个数
    		a=b; //赋值,向前推进
    		b=c;
    	}
    	cout<<c<<".00"; //输出的数为整数,所以要加两个0
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    test3

  • 相关阅读:
    高可用k8s集群(k8s-1.29.2)
    Automatic Open-World Reliability Assessment
    讲清楚两个简单的概念之进程、线程
    java小游戏-飞翔的小鸟
    【测试】微软测试框架playwright的使用
    BL808学习日志-1-三核通讯
    HTML静态网页作业——关于我的家乡介绍安庆景点
    【JS高级】js面向对象三大特性之多态_07
    神经网络模型的训练过程,神经网络模型训练过程
    CDN许可证申请
  • 原文地址:https://blog.csdn.net/weixin_45122104/article/details/126191733