本来决定上个月开始每天做一两道acm的,结果总是这里忙那里忙的,时间就这么溜走了。
没时间都是借口,刷一道题不过半小时左右,要坚持,从今天开始!
/*
* acm.njupt.edu.cn---1003
*
* 在数学上,斐波那契数列(Fibonacci Sequence),是以递归的方法来定义:
* F0 = 0
* F1 = 1
* Fn = Fn - 1 + Fn - 2
* 用文字来说,就是斐波那契数列由0和1开始,之后的斐波那契数就由之前的两数相加。首几个斐波那契数是:
* 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946,………………
*
* 输入:斐波那契数列项数n,0≤n≤40。
*
* 输出:斐波那契数列第n项数值
*
*/
#include <stdio.h>
using namespace std;
int getFeberNum(int n);
int main() {
int n;
scanf("%d", &n);
// cout << getFeberNum(n) << endl;
printf("%d\n", getFeberNum(n));
return 0;
}
/*
* 获取第n项的斐波那契数,注意0不是第一项,0是第0项
*/
int getFeberNum(int n) {
/*
* 观察斐波那契数列可以发现,
* k>=1时
* a[k+1]-a[k]=a[k-1]
* 用递归应该可以做
* a[k+1]=a[k]+a[k-1]
*
* k>=2时
* a[k]=a[k-1]+a[k-2]
*
* 后来发现递归会超时,需要换一种方法
*
*/
int f;
int f1 = 1, f2 = 1; //第一轮传入参数的时候,f1为a[1],f2为a[2]
int result = 0;
if (n <= 1) {
result = n;
} else {
// result = getFeberNum(n - 1) + getFeberNum(n - 2); //递归调用会超时
for (int i = 2; i < n; i++) {
f = f1 + f2;
f1 = f2;
f2 = f;
}
result = f;
}
return result;
}