UVA12459 Bees‘ ancestors 的题解

UVA12459 Bees’ ancestors 的题解

洛谷传送门
UVA传送门

题目大意

输入 n n n ,输出斐波那契额数列的第 n n n 项。读到 0 0 0 停止。


思路

  1. 斐波那契数列为 f ( i ) = f ( i − 1 ) + f ( i − 2 ) f(i) = f(i - 1) + f(i - 2) f(i)=f(i1)+f(i2) 所以我们预处理每一项的值,然后根据输入进行输出。
代码
#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;
}
  1. 利用公式 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(215 )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 fibnfibn1fibn2=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+14×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×1114×1×−1 =215 。 原通项公式为 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=5 1 b = − 1 5 b = - \frac{1}{\sqrt{5}} b=5 1 ,可知 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(215 )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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值