首页 > 代码库 > ACM2 斐波那契数列

ACM2 斐波那契数列

描述

在数学上,斐波那契数列(Fibonacci Sequence),是以递归的方法来定义:

F0 = 0

F1 = 1

Fn = Fn - 1 + Fn - 2

用文字来说,就是斐波那契数列由01开始,之后的斐波那契数就由之前的两数相加。首几个斐波那契数是:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946,………………

特别指出:0不是第一项,而是第零项。

在西方,最先研究这个数列的人是比萨的列奥纳多(又名斐波那契),他描述兔子生长的数目时用上了这数列。

n       第一个月有一对刚诞生的兔子

n       第两个月之后它们可以生育

n       每月每对可生育的兔子会诞生下一对新兔子

n       兔子永不死去

假设在n月有新生及可生育的兔子总共a对,n+1月就总共有b对。在n+2月必定总共有a+b对:因为在n+2月的时候,所有在n月就已存在的a对兔子皆已可以生育并诞下a对后代;同时在前一月(n+1)b对兔子中,在当月属于新诞生的兔子尚不能生育。

 

现请以较短的时间,求出斐波那契数列第n项数值,0n40

 

 

输入

 

斐波那契数列项数n0n40

 

输出

 

斐波那契数列第n项数值

 

样例输入

4

样例输出

3

 
1.递归方式
 1 #include<stdio.h> 2 int func(int n); 3 int main() 4 { 5     int num; 6     while (scanf("%d",&num) == 1) 7     { 8         printf("%d\n", func(num)); 9     }10 }11 12 int func(int n)13 {14     if (n < 1)15         return 0;16     if (n == 1 || n == 2)17         return 1;18     if (n > 2)19         return func(n - 1) + func(n - 2);20 }

2.数组方式

 1 #include <stdio.h> 2 #include <stdlib.h> 3  4 int func(int n); 5 int main() 6 { 7     int num; 8     while (scanf("%d",&num) == 1) 9     {10         printf("%d\n", func(num));11     }12 }13 int func(int n)14 {15     if (n < 1)16         return 0;17     if (n == 1 || n == 2)18         return 1;19     int *a;20     a = (int*)malloc(sizeof(int)*n);21     *a = *(a + 1) = 1;22     for (int i = 2; i < n; i++)23     {24         a[i] = a[i - 1] + a[i - 2];25     }26     int res = a[n - 1];27     free(a);28     return res;29 }

3.迭代方式

 1 #include <stdio.h> 2 int func(int n); 3 int main() 4 { 5     int num,f; 6     while (scanf("%d", &num) == 1) 7     { 8         f = func(num); 9         printf("%d\n", f);10     }11 }12 int func(int n)13 {14     if (n < 1)15         return 0;16     if (n == 1 || n == 2)17         return 1;18     int a1 = 1, a2 = 1, a3 = 1;19     for (int i = 2; i < n; i++)20     {21         a3 = a2 + a1;22         a1 = a2;23         a2 = a3;24     }25     return a3;26 }

 

ACM2 斐波那契数列