斐波那契数列java蓝桥杯
时间: 2025-05-13 18:57:14 浏览: 22
### Java 实现斐波那契数列的蓝桥杯题目及解答
#### 题目描述
给定正整数 \( n \),求斐波那契数列的第 \( n \) 项。
注意:由于结果可能会非常大,因此要求输出的结果是对 10007 取模后的值。
输入格式:单个整数 \( n \) (\( 1 \leq n \leq 1,000,000 \))。
输出格式:一个整数,表示斐波那契数列第 \( n \) 项对 10007 的取模结果。
---
#### 解决方案
以下是基于动态规划的思想来解决该问题的一种高效方法:
```java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
// 初始化数组大小为 n+2 是为了方便索引操作
int[] F = new int[n + 2];
F[1] = 1;
F[2] = 1;
if (n > 2) {
for (int i = 3; i <= n; i++) {
F[i] = (F[i - 1] + F[i - 2]) % 10007;
}
}
System.out.println(F[n]);
}
}
```
上述代码通过循环迭代的方式计算斐波那契数列中的每一项,并利用取模运算防止溢出[^1]。这种方法的时间复杂度为 \( O(n) \),空间复杂度也为 \( O(n) \)。
如果希望进一步优化空间复杂度,则可以仅保留最近的两项来进行状态转移:
```java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
if (n == 1 || n == 2) {
System.out.println(1);
return;
}
int prev1 = 1; // 表示 F(i-1)
int prev2 = 1; // 表示 F(i-2)
for (int i = 3; i <= n; i++) {
int current = (prev1 + prev2) % 10007;
prev2 = prev1;
prev1 = current;
}
System.out.println(prev1);
}
}
```
此版本的空间复杂度降低至 \( O(1) \)[^4],而时间复杂度仍保持为 \( O(n) \)。
---
#### 黄金分割比例的应用
对于较大的 \( n \),可以直接近似使用黄金分割比例 \( \phi = \frac{\sqrt{5} + 1}{2} \approx 1.6180339887 \) 来估算斐波那契数列的比例关系。然而,在实际编程比赛中通常不会采用这种方式,因为浮点误差可能导致精度不足[^2]。
---
#### 大规模数据处理注意事项
当 \( n \) 较小时,直接存储整个序列即可;但如果 \( n \) 很大(例如达到百万级别),则需特别关注内存占用以及性能瓶颈。此外,还需考虑中间结果是否会超出 `long` 数据类型的范围。在这种情况下,提前对每一步结果进行取模是一种常见且有效的策略[^5]。
---
阅读全文
相关推荐



















