题意:中文题,自行理解。
题目链接:http://oj.ecustacm.cn/problem.php?id=1478
之后查了发现:
相邻两个斐波那契数的比值是随着序号的增加逐渐趋于黄金分割比。即f(n)/f(n+1)-→0.618…。
原来这是一个规律,我之前复习斐波那契怎么没复习到!!!
PS:这题我没有思路,查了发现就是个裸的直接输出看结果题目,可是我做的时候是真的不知道从何入手。
输出一部分看看:
printf("%d %.8lf
",x++,f[i-1]*1.0/f[i]);
// 有个小技巧,做题可以用:不用再去开一个for循环去输出f[i]/f[i+1],而是直接在第一个循环中对式子进行变形写成f[i-1]*1.0/f[i]即可,还需要注意x从几开始,可以和样例对照着看。
2 0.50000000
3 0.66666667
4 0.60000000
5 0.62500000
6 0.61538462
7 0.61904762
8 0.61764706
9 0.61818182
10 0.61797753
11 0.61805556
12 0.61802575
13 0.61803714
14 0.61803279
15 0.61803445
16 0.61803381
17 0.61803406
18 0.61803396
19 0.61803400
20 0.61803399
21 0.61803399
22 0.61803399
23 0.61803399
24 0.61803399
25 0.61803399
26 0.61803399
27 0.61803399
28 0.61803399
29 0.61803399
30 0.61803399
31 0.61803399
32 0.61803399
33 0.61803399
34 0.61803399
35 0.61803399
36 0.61803399
37 0.61803399
38 0.61803399
39 0.61803399
40 0.61803399
41 0.61803399
42 0.61803399
43 0.61803399
44 0.61803399
45 0.61803399
46 0.61803399
47 0.61803399
48 0.61803399
49 0.61803399
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll f[25];
int main()
{
int n;
cin>>n;
f[1]=1,f[2]=1;
int x=2;
for(int i=3; i<=25; i++)
{
f[i]=f[i-1]+f[i-2];
//printf("%d %.8lf
",x++,f[i-1]*1.0/f[i]);
}
if(n>=20)
cout<<"0.61803399"<<endl;
else
printf("%.8lf
",f[n]*1.0/f[n+1]);
return 0;
}
注意
因为我只试了一组数据就是样例,导致代码一直不对,后来测一下数据发现是cout的问题,以前从来没有注意过这个问题,以为cout就是直接输出没有任何格式。
于是,我今天找bug找了好久。
这里说明一下,
C++默认流的输出有效位是6位。
所以我直接输出cout<<0.61803399<<endl这样子,是得不到正确答案的,只会输出0.618034。
cout格式化输出小数点后位数
#include <iomanip> 头文件
std::cout<<std::fixed<<std::setprecision(8)<<1.23456789123456<< std::endl; 控制输出位数8位的格式,这个之前用过,不好记,还是printf控制。
出错代码部分
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
cout<<"0.61803399"<<endl; // 0.61803399
cout<<0.61803399<<endl; // 0.618034
return 0;
}