DP1. 斐波那契数列
描述
输入描述
仅输入一个正整数 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; }