UVA12459 Bees’ ancestors 的题解
洛谷传送门
UVA传送门
题目大意
输入 n n n ,输出斐波那契额数列的第 n n n 项。读到 0 0 0 停止。
思路
- 斐波那契数列为 f ( i ) = f ( i − 1 ) + f ( i − 2 ) f(i) = f(i - 1) + f(i - 2) f(i)=f(i−1)+f(i−2) 所以我们预处理每一项的值,然后根据输入进行输出。
代码
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
long long f[105] = {0, 1, 2};
for (int i = 3; i <= 85; i ++) { // 预处理
f[i] = f[i - 1] + f[i - 2];
}
while (cin >> n) {
if (n == 0) {
return 0;
}
cout << f[n] << endl; // 调用
}
return 0;
}
- 利用公式
f
i
b
n
=
(
1
+
5
2
)
n
−
(
1
−
5
2
)
n
5
fib_n = \frac{(\frac{1 + \sqrt{5}}{2})^n - (\frac{1 - \sqrt{5}}{2})^n}{\sqrt{5}}
fibn=5(21+5)n−(21−5)n
证明过程:斐波那契的递推式为 f i b n − f i b n − 1 − f i b n − 2 = 0 fib_n - fib_{n - 1} -fib_{n - 2} = 0 fibn−fibn−1−fibn−2=0 ,特征方程为 $ x ^ 2 - x - 1 = 0$ , 根据一元二次方程的公式,得到 x 1 = 1 + 1 − 4 × 1 × − 1 2 × 1 = 1 + 5 2 x_1 = \frac{1 + \sqrt{1 - 4 \times 1 \times -1}}{2 \times 1} = \frac{1 + \sqrt{5}}{2} x1=2×11+1−4×1×−1=21+5 , x 2 = 1 − 1 − 4 × 1 × − 1 2 × 1 = 1 − 5 2 x_2 = \frac{1 - \sqrt{1 - 4 \times 1 \times -1}}{2 \times 1} = \frac{1 - \sqrt{5}}{2} x2=2×11−1−4×1×−1=21−5 。 原通项公式为 f i b n = a × x 1 n + b × x 2 n fib_n = a \times x1 ^ n + b \times x2 ^ n fibn=a×x1n+b×x2n , a = 1 5 a = \frac{1}{\sqrt{5}} a=51 , b = − 1 5 b = - \frac{1}{\sqrt{5}} b=−51 ,可知 f i b n = ( 1 + 5 2 ) n − ( 1 − 5 2 ) n 5 fib_n = \frac{(\frac{1 + \sqrt{5}}{2})^n - (\frac{1 - \sqrt{5}}{2})^n}{\sqrt{5}} fibn=5(21+5)n−(21−5)n
代码
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
while (1 == 1){
cin >> n;
if (n == 0) {
break;
}
double ans = (pow ((1 + sqrt(5)) / 2, n + 1) + pow((1 - sqrt(5)) / 2, n + 1)) / sqrt(5); // 公式
cout << round(ans) << endl; // 防止精度丢失
}
return 0;
}
该文介绍了如何解决UVA12459问题,即输出斐波那契数列的指定项。文中提供了两种方法,一种是通过预处理斐波那契数列的前若干项,另一种是利用斐波那契数列的数学公式直接计算,避免了精度丢失的问题。

被折叠的 条评论
为什么被折叠?



