蓝桥杯——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
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; 

}

【运行结果】

蓝桥杯——Fibonacci数列与黄金分割_第1张图片

【解题思路】

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

你可能感兴趣的:(算法设计与分析,蓝桥杯,动态规划,算法)