列表

详情


DP1. 斐波那契数列

描述

大家都知道斐波那契数列,现在要求输入一个正整数 n ,请你输出斐波那契数列的第 n 项。
斐波那契数列是一个满足 的数列
数据范围:
要求:空间复杂度 ,时间复杂度 ,本题也有时间复杂度 的解法

输入描述

仅输入一个正整数 n。

输出描述

输出斐波那契数列中第 n 个数。

示例1

输入:

4

输出:

3

说明:

根据斐波那契数列的定义可知,fib(1)=1,fib(2)=1,fib(3)=fib(3-1)+fib(3-2)=2,fib(4)=fib(4-1)+fib(4-2)=3,所以答案为3。 

示例2

输入:

1

输出:

1

示例3

输入:

2

输出:

1

原站题解

C 解法, 执行用时: 2ms, 内存消耗: 332KB, 提交时间: 2022-03-05

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n;
    scanf("%d", &n);
    int a,b,c;
    for(int i=1; i <=n; i++)
    {
        
        
        if(i==1)
        {
            a=1;           
        }
        else if(i==2)
        {
            b=1;           
        }else 
        {
            c=b;
            b=b+a;
            a=c;
        }
           
    }
    printf("%d", b);
    
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 336KB, 提交时间: 2022-05-22

#include <stdio.h>

int main() {
    int n = 0;
    scanf("%d", &n);
    
    int fn[41] = {0};
    fn[1] = 1;
    fn[2] = 1;
    if(n < 3) {
        printf("%d\n", fn[n]);
        return 0;
    }
    for(int i = 3; i <= n; ++i) {
        fn[i] = fn[i - 1] + fn[i - 2];
    }
    printf("%d\n", fn[n]);
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 340KB, 提交时间: 2022-03-28

#include <stdio.h>
#include <string.h>
#include <assert.h>
void matrix_square(int (*A)[2])
{
    int tmp_A[2][2];   memcpy(tmp_A, A, 4*sizeof(int));
    for(int i=0; i<2; ++i)
        for(int j=0; j<2;++j)
            A[i][j] = tmp_A[i][0]*tmp_A[0][j]+tmp_A[i][1]*tmp_A[1][j];
}
void matrix_multiplication(int (*A)[2], int (*B)[2])
{
    int tmp_A[2][2];   memcpy(tmp_A, A, 4*sizeof(int));
    for(int i=0; i<2; ++i)
        for(int j=0; j<2;++j)
            A[i][j] = tmp_A[i][0]*B[0][j]+tmp_A[i][1]*B[1][j];
}
void matrix_quick_pow(int (*res)[2], int (*A)[2], int exponent)
{
    while(exponent)
    {
        if(exponent & 1) matrix_multiplication(res, A);
        matrix_square(A);   exponent >>= 1;
    }
}
int main(void)
{
    int n;
    while(scanf("%d", &n) != EOF)
    {
        assert(n>0 && n<=40);
        
        if(n < 3){ printf("1\n");   continue; }
        
        int res[2][2] = {{1, 0}, {0, 1}}, A[2][2] = {{1, 1}, {1, 0}};
        matrix_quick_pow(res, A, n-2);
        printf("%d\n", res[0][0]+res[0][1]);
    }
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 344KB, 提交时间: 2022-06-07

#include <stdio.h>

void func()
{
    int n;
    scanf("%d", &n);
    // dp[i] 表示前N项的斐波那契数列值
    // dp[i] = dp[i-1] + dp[i-2]
    // dp[0] = 1, dp[1] = 1;
    int dp[40] = {0};
    int i;
    dp[0] = 1;
    dp[1] = 1;
    for (i = 2; i < n; ++i) {
        dp[i] = dp[i - 1] + dp[i - 2];
    }
    printf("%d", dp[n - 1]);
}

int main()
{
    func();
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 352KB, 提交时间: 2022-04-08

#include <stdio.h>
int main(){
     int input,i;
    scanf("%d",&input);
    int a[input];
    a[0] = 1;
    a[1] = 1; 
    for(i = 2 ; i < input ; i++){
       a[i] = a[i-1] + a[i-2];
    }
    printf("%d",a[i-1]);
    return 0;
}

上一题