【问题描述】
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的情况来算即可。