35.牛牛学数列5

210 阅读1分钟

链接:ac.nowcoder.com/acm/problem…
来源:牛客网

题目描述

求fib数列的第n项,前几项是1,1,2,3,5,每一项都等于前面两项的和

输入描述:

输入一个整数n,n<=46 

输出描述:

输出一个整数

示例1

输入

2

输出

1

规律

1,1,2,3,5,每一项都等于前面两项的和

代码1

用递归实现,将第一个和第二个设为1,其他数字设为前两个数之和

#include <bits/stdc++.h>

using namespace std;

int solve(int num){
    if(num == 1 || num == 2) return 1;
    else return solve(num - 1) + solve(num - 2);
}

int main(){
    int n;
    cin >> n;
    cout << solve(n);
    return 0;    
}

代码2

用数组实现

注意1

如果下标为0开始,只能num[i+2] = num[i] + num[i+1];不然会越界

修改之后的部分代码

  int num[1000] = {1,1};
    for(int i = 0;i < n; i++){
        num[i+2] = num[i] + num[i+1];
    }
    cout << num[n-1];

如果下标为2开始,就可以num[i] += num[i-1] + num[i-2];

修改之后的部分代码

    int num[1000] = {1,1};
    for(int i = 2;i < n; i++){
        num[i] += num[i - 1] + num[i - 2];
    }
    cout << num[n-1];

注意2

也不能重新设置一个新变量来接受,因为除了num[1] 和 num[2] 之外的其他数字都是0

注意3

如果是按照个数来看,那就最后输出num[n]

如果是按照下标来看,那就要减一输出num[n-1]

完整代码

#include <bits/stdc++.h>

using namespace std;

int main(){
    int n;
    cin >> n;
    int num[1000] = {1,1};
    for(int i = 2;i < n; i++){
        num[i] += num[i - 1] + num[i - 2];
    }
    cout << num[n-1];
    return 0;    
    
}