题解
计算分数表达式_斐波那契数列
1 条题解
-
0
解题思路
这道题的表达式(看图)是:
f(n) = 1/F1 + 1/F2 + 1/F3 + ... + 1/Fn
其中 F 是斐波那契数列:1、1、2、3、5、8、13…… 它的规律特别简单:从第3项开始,每一项 = 前两项之和(比如 2=1+1,3=1+2,5=2+3)。
先看样例 n=5: f(5) = 1/1 + 1/1 + 1/2 + 1/3 + 1/5 = 1 + 1 + 0.5 + 0.333... + 0.2 = 3.0333...
保留三位小数就是 3.033,和样例完全一致!
怎么写程序?
我们需要边生成斐波那契数列边累加。用两个变量
a、b滚动前进:- 一开始
a=1(第1项),b=1(第2项); - 每一轮加上
1/a; - 然后算下一个斐波那契数:
c = a + b,再让a = b、b = c,整体往后挪一格。
这样循环 n 次,就能把前 n 项的倒数都加起来,不用开数组,非常省内存!
保留三位小数:题目要求用格式化输出,我们用
printf("%.3lf\n", sum),其中.3就是"保留3位小数"的意思。注意:累加分数时要用
1.0 / a,写成1 / a就变成整数除法了(结果永远是0),这是最容易犯的小错误!参考代码
// P4479 计算分数表达式(斐波那契数列):f(n)=1/F1+1/F2+...+1/Fn,F为斐波那契数列1,1,2,3,5,... // 题目要求格式化输出,保留三位小数,使用printf #include <iostream> #include <cstdio> using namespace std; int main() { int n; cin >> n; double sum = 0; // 累加所有分数的和 double a = 1, b = 1; // 斐波那契数列前两项 F1=1, F2=1 for (int i = 1; i <= n; i++) { sum += 1.0 / a; // 加上第i项 1/Fi(用1.0保证是小数除法) double c = a + b; // 下一个斐波那契数 = 前两项之和 a = b; // 整体往后挪:原来的b变成新的a b = c; // 新的b是最新算出的数 } printf("%.3lf\n", sum); // 保留三位小数输出 return 0; }复杂度分析
- 时间:循环 n 次生成斐波那契数并累加,是 O(n)。n 再大也不用怕,每次只有一次加减和除法。
- 空间:只用了
sum、a、b、c几个变量,是 O(1),几乎不占内存。
- 一开始
- 1