1. 程式人生 > >題目4-7 斐波那契數列、跳臺階、矩形覆蓋

題目4-7 斐波那契數列、跳臺階、矩形覆蓋

這些題目的做法都很類似,所以放在一起寫,都是同類型的遞推題。題目4、5、7遞推式其實都是斐波那契數列:f(n)=f(n-1)+f(n-2),其中的初值不同。題目6的遞推式為f(n)=f(n-1)+f(n-2)+...f(0),由些可得f(n - 1) = f(n - 2) + f(n -3) + ...+f(0);所以可得:f(n) = 2*f(n - 1);都可以通過迭代直接求得!!注意題目的資料範圍,可能會超int範圍。所以用long long int!

以下給出第4題 和第6題 的AC程式碼!第4題、第5題、第7題的程式碼類似,只要更改一下初值就可以了!

 //第四題 原始碼 
 #include <iostream>
 #include <cstdio>
 #include <string>
 #include <cstring>
 #include <cctype>
 #include <cstdlib>
 #include <string.h>
 #include <algorithm>
 #include <cmath>
 using namespace std;
 
 #define N 90
 #define LL long long int
 
 LL ans[N + 10];
 void generate()
 {
      int i;
      ans[0] = ans[1] = 1;
      for(i = 2;i <= N;i++)
            ans[i] = ans[i - 1] + ans[i - 2]; 
      return;
 }
 int main()
 {
     int n;
     generate();
     while(scanf("%d",&n) == 1)
     {
                          printf("%lld\n",ans[n]);//注意使用64位數
     }
     return 0;
 }
 
 //第六題原始碼 
 #include <iostream>
 #include <cstdio>
 #include <string>
 #include <cstring>
 #include <cctype>
 #include <cstdlib>
 #include <string.h>
 #include <algorithm>
 #include <cmath>
 using namespace std;
 
 #define N 65
 #define LL long long int
 
 LL fib[N];
 
 void generate()
 {
      int i;
      fib[0] = fib[1] = 1;
      for(i = 2;i <= 50;i++)
            fib[i] = 2 *fib[i - 1];
 }
      
 int main()
 {
     int n;
     generate();
     while(scanf("%d",&n) == 1)
     {
                          printf("%lld\n",fib[n]);//注意用64位
     }
     return 0;
 }