牛客网NC231954:斐波那契数列 (简单的数列问题)
牛客网NC231954:斐波那契数列 (简单的数列问题)
题目描述
本题要求我们计算斐波那契数列的第n项,斐波那契数列定义如下:
- f(1) = 1
- f(2) = 1
- f(n) = f(n-1) + f(n-2),当n ≥ 3
给定整数n,求f(n)的值。
算法思路
斐波那契数列是一个经典问题,有多种解法:
- 递归法(不推荐,时间复杂度高)
- 动态规划(使用数组存储所有值)
- 迭代法(只保存必要的变量)
本题采用了迭代法,只保存前两个数字状态,空间复杂度为O(1),时间复杂度为O(n)。
代码实现
#include<bits/stdc++.h>
using namespace std;
int main(){int n;cin>>n;int f1=1,f2=1,f3;if(n==1)f3=f1;if(n==2)f3=f2;else {for(int i=3;i<=n;i++){f3=f1+f2;f2=f1;f1=f3;}}cout<<f3<<endl;
}
代码详解
-
变量初始化:
f1=1
:表示f(1)的值f2=1
:表示f(2)的值f3
:用于存储计算结果
-
基础情况处理:
- 当n=1时,直接返回f1的值,即1
- 当n=2时,直接返回f2的值,即1
-
迭代计算:
- 当n≥3时,进入循环计算
- 每次迭代,
f3 = f1 + f2
计算当前值 - 然后更新状态:
f2 = f1
,f1 = f3
- 这样f1始终保存最新计算出的值,f2保存前一个值
-
输出结果:最终f3存储了f(n)的值
复杂度分析
- 时间复杂度:O(n),需要循环n-2次
- 空间复杂度:O(1),只使用了常数级别的存储空间
总结
这段代码简洁高效地解决了斐波那契数列问题。采用迭代方法避免了递归带来的重复计算问题,优化了时间和空间复杂度。值得注意的是,当处理更大的n值时,需要考虑整数溢出问题,可能需要使用长整型或其他方法来处理。