题目:斐波那契数列是指这样的数列:数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和。给出一个正整数k,要求斐波那契数列中第k个数是多少?
输入描述:输入一行,包含一个正整数k。(0<k<47)
输出描述:输出一行,包含一个正整数,表示一个斐波那契数列中第k个数的大小。
输入:19
输出:4181
思路:在不考虑运行时间时,可以直接使用递归
#include "stdafx.h"
#include <iostream>
using namespace std;
int Fib(int k){
if (k == 1 && k == 2)
return 1;
else
return k*Fib(k - 1);
}
int _tmain()
{
int k;
cout << "请输入一个正整数k" << endl;
cin >> k;
cout << Fib(k) << endl;
return 0;
}
由于通过反复递归后,调用时间过长,有以下优化
#include "stdafx.h"
#include <iostream>
using namespace std;
int Fib(int k){
int a = 1;
int b = 1;
int c;
for (int i = 1; i < k; i++){
c = a + b;
a = b;
b = c;
}
return a;
}
int _tmain()
{
int k;
cout << "请输入一个正整数k" << endl;
cin >> k;
cout << Fib(n) << endl;
while (1);
return 0;
}
当同时运行以上两段代码时,可以明显发现运行时间不同,而在题目中k的值为何是0~47,取不到47,因为当k=47时,结果超出了Int的字长