题目链接: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−(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,保留两位小数。
6
8.00
对于所有数据: 0 ≤ n ≤ 48 0 \leq n\leq 48 0≤n≤48。
看到那个牛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−(21−5)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;
}
还可以用函数解:
#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;
}
两种方法都能过
很完美,对吧?
直到我看到了百度上的一张图:
原来,人家是有化简公式的!
F
n
=
F
(
n
−
1
)
+
F
(
n
−
2
)
F_n=F(n-1)+F(n-2)
Fn=F(n−1)+F(n−2)
于是,又出现了一种方法…
#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;
}