1. 程式人生 > >有一隻兔子,從出生後第3個月起每個月都生一隻兔子,小兔子長到第三個月後每個月又生一隻兔子,假如兔子都不死,問每個月的兔子總數為多少?

有一隻兔子,從出生後第3個月起每個月都生一隻兔子,小兔子長到第三個月後每個月又生一隻兔子,假如兔子都不死,問每個月的兔子總數為多少?

這是一道斐波拉契數列題目,很自然會想到使用遞迴f(n)=f(n-1)+f(n-2),但是使用遞迴的方式
會導致很多重複計算,因此,可以用第二種方法:用組數儲存已經計算過的數值,當後面計算需
要使用前面的值時,可以直接從陣列內取,方法如下:

package com.neu.test12;

import java.util.Scanner;

public class 統計兔子數 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner sc = new
Scanner(System.in); int n = Integer.parseInt(sc.nextLine()); int[] sum = new int[n + 1]; sum[1] = 1; sum[2] = 1; for (int i = 3; i <= n; i++) { sum[i] = sum[i - 1] + sum[i - 2]; } System.out.println(sum[n]); } }

使用陣列來儲存已經計算過的陣列,這種方法在本地編譯器上能夠通過,但是在牛客上提交程式碼通過不了
原因就是:當輸入的month過大時,動態申請的記憶體會很大,導致溢位,所以,這種方法也不好。
下面是一種最簡單的方法,不需要額外的申請記憶體,也不需要重複計算 ,方法如下:



#include <stdlib.h>
#include <stdio.h>
int main()
    {
    int month;
    while(scanf("%d", &month) != EOF)
        {
        int i;
        long sum;
        long x, y;
        x = 1;
        y = 1;
        if(month > 2)
        {
            for(i = 3; i <= month; i++)
                {
                sum = x + y;
                x = y;
                y = sum;
                }
        }
        printf
("%ld", sum); printf("\n"); } return 0; }