蓝桥杯——Fibonacci数列与黄金分割

【问题描述】

Fibonacci数列是非常著名的数列:F[1]=1,F[2]=1,
对于i>3,F[i] = F[i-1] + F[i-2]
Fibonacci数列有一个特殊的性质,前一项与后一项的比值,F[i] / F[i+1],会趋近于黄金分割。为了验证这一性质,给定正整数N,请你计算F[N] / F[N+1],并保留8位小数。
【输入格式】
一个正整数N。(1≤N≤2000000000)
【输出格式】
F[N] / F[N+1]。答案保留8位小数。
【样例输入】
2
【样例输出】
0.50000000

【源代码】

#include<stdio.h>
int dp[1000];
int Fibonacci_way1(int N){ //递归求斐波拉契 
	if(N==1||N==2)
	return 1;
	else 
	return (Fibonacci_way1(N-1) + Fibonacci_way1(N-2));
}
int Fibonacci_way2(int N){//动态规划求斐波拉契 
	for(long long i = 3;i <= N;i++){
		dp[i]=dp[i-1] + dp[i-2];
	}
	return dp[N];
}
void fun(){
	int N_num;
	int Fib_A;
	int Fib_B;
	double FibA_FibB;
	dp[1]=dp[2]=1;
	printf("                 Fibonacci数列与黄金分割             \n");
	printf("                                      \n");
	printf("请输入正整数N:");
	scanf("%d",&N_num);
	if(N_num>=20){
		Fib_A = Fibonacci_way2(20);
		Fib_B = Fibonacci_way2(21);
	}
	else{
		Fib_A = Fibonacci_way2(N_num);
		Fib_B = Fibonacci_way2(N_num+1);
	}
	FibA_FibB = (Fib_A*1.0)/(Fib_B*1.0);
	printf("黄金分割的结果为%.8lf\n",FibA_FibB);
} 
int main(){
	dp[1]=dp[2]=1;
	fun();
	return 0; 

}

【运行结果】

在这里插入图片描述

【解题思路】

当N过大的时候,发现数据太大,不妨先打表看看结果,打表发现当N=1 ~ 19的时候答案都不一样,当N >= 20 的时候,保留八位有效数字的答案都是一样的,所以当N大于等于20的时候,都按照20的情况来算即可。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

留小乙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值