P1720 月落乌啼算钱(斐波那契数列)

文章展示了两种方法计算斐波那契数列,一种是记忆数组法,另一种是递推法,用于解决月落乌啼的问题。
摘要由CSDN通过智能技术生成

月落乌啼算钱(斐波那契数列)

题目背景

(本道题目木有隐藏歌曲……不用猜了……)

《爱与愁的故事第一弹·heartache》最终章。

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

题目描述

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

F n = ( 1 + 5 2 ) n − ( 1 − 5 2 ) n 5 F_n=\dfrac{\left(\frac{1+\sqrt{5}}{2}\right)^n-\left(\frac{1-\sqrt{5}}{2}\right)^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

样例输入 #1

6

样例输出 #1

8.00

提示

对于所有数据: 0 ≤ n ≤ 48 0 \leq n\leq 48 0n48
---------------------------------------------------------分割线---------------------------------------------------------
该题参考了洛谷的部分题解,我给集成了一下,方便日后复习
题目链接:P1720 月落乌啼算钱(斐波那契数列)

CODE

#include<bits/stdc++.h>
//若输入一个数且题意拥有前后相关联的关系(即当前的目的是在之前的前提之下才形成的),那么直接采用一个一个数字来寻找规律,直接递推。
using namespace std;
/*法2*/
double f[100] = {0,1,1};//记忆数组 
double fabo(int n) {
	if(n==0) return f[n]=0; //返回值并记录
	if(n==1) return f[n]=1; //返回值并记录
    if (!f[n])f[n]=fabo(n-1)+fabo(n-2);//算过的直接返回,没算过的计算
return f[n];
}
int main()
{
	int n;cin>>n;
	cout<<fixed<<setprecision(2)<<fabo(n);
	/*此处多加一个/在/*前面就可以 便捷使用法3 
	//	法3,递推: 
	//	从1开始找规律
	//	输入:1 结果:1.00
	//	输入:2 结果:1.00
	//	输入:3 结果:2.00
	//	输入:4 结果:3.00
	//	输入:5 结果:5.00
	//=>斐波那契:当前第N项等于前两项之和
    double f[50];
    int n,i;
    f[0]=0;f[1]=1;f[2]=1;   //递归边界条件
    cin>>n;
    for (i=3;i<=n;i++)f[i]=f[i-1]+f[i-2];  //开始使用斐波那契数列
    cout<<fixed<<setprecision(2)<<f[n];
    //*/
    return 0;
}
/**/
/*
法1.传统递归超时 
long long f(int n) {
    if(n == 1||n == 2)return 1;
    return f(n - 1) + f(n - 2);
}
cout << f(n) <<".00"<< endl;
*/
/*
法2.记录已算过的,空间换时间递归 
double f[100] = {0,1,1};//记忆数组 
double f(int n) {
	if(n==0) return f[n]=0; //返回值并记录
	if(n==1) return f[n]=1; //返回值并记录
    if (!f[n]) {//算过的直接返回,没算过的计算
        f[n] = f(n - 1) + f(n - 2);
    }
    return f[n];
}
*/ 



  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值