月落乌啼算钱(斐波那契数列)
题目背景
(本道题目木有隐藏歌曲……不用猜了……)
《爱与愁的故事第一弹·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−(21−5)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
0≤n≤48。
---------------------------------------------------------分割线---------------------------------------------------------
该题参考了洛谷的部分题解,我给集成了一下,方便日后复习
题目链接: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];
}
*/