学习一直在进行……

好久没更新了,但这并不代表我一直在偷懒,学习一直在进行,只是工作繁忙,哈哈~~~

等再次接宽带再更新喽^^ ^^ 

我们的问题是:**给定一个整数 `m`,找出斐波那契数列中第一个大于 `m` 的项是第几项(从第1项开始计数)**。 --- ### 🔍 斐波那契数列定义(本题版本): 题目背景给出的数列为: > 1, 1, 2, 3, 5, 8, 13, 21, ... 所以: - 第1项:1 - 第2项:1 - 第3项:2 - 第4项:3 - 第5项:5 - …… 这对应的是标准斐波那契的一种变体,即: - F(1) = 1 - F(2) = 1 - F(n) = F(n−1) + F(n−2),n ≥ 3 注意:这个和以 F(0)=0, F(1)=1 开头的略有不同。这里是从 **F(1)=1, F(2)=1** 开始的。 --- ### ✅ 解题思路: 我们需要从小到大生成斐波那契数列的每一项,直到某一项 **首次大于 m**,然后返回该项的**序号(项数)**。 由于 `m >= 0`,我们可以处理如下边界情况: - 若 m = 0,则第一项 1 > 0 → 返回 1 - 若 m = 1,则前两项都是 1,不大于;第三项 2 > 1 → 返回 3 使用迭代法逐项生成即可,时间复杂度很低(因为斐波那契增长很快)。 --- ### ✅ C++ 实现代码: ```cpp #include <iostream> using namespace std; int main() { long long m; cin >> m; long long f1 = 1; // 第1项 long long f2 = 1; // 第2项 int n = 1; // 当前正在检查的项数 // 如果第1项就大于m if (f1 > m) { cout << n << endl; return 0; } n = 2; if (f2 > m) { cout << n << endl; return 0; } // 从第3项开始计算 long long fn; while (true) { n++; fn = f1 + f2; // 计算F(n) if (fn > m) { cout << n << endl; break; } // 更新前两项 f1 = f2; f2 = fn; } return 0; } ``` --- ### 🔍 代码解释: - 使用 `f1` 和 `f2` 分别表示前两项 - 用 `n` 表示当前要生成的项的序号 - 循环生成下一项,直到它大于 `m` - 一旦找到,立即输出 `n` 并结束 > 使用 `long long` 是为了防止大 `m` 导致溢出(虽然题目未说明范围,但安全起见) --- ### ✅ 示例测试: #### 输入: ``` 1 ``` 斐波那契:1, 1, 2 → 第3项是第一个大于1的 → 输出:`3` #### 输入: ``` 5 ``` 序列:1, 1, 2, 3, 5, **8** → 第6项 8 > 5 → 输出:`6` #### 输入: ``` 0 ``` 第1项 1 > 0 → 输出:`1` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值