有一隻兔子,從出生後第3個月起每個月都生一隻兔子,小兔子長到第三個月後每個月又生一隻兔子,假如兔子都不死,問每個月的兔子總數為多少?
阿新 • • 發佈:2019-02-03
這是一道斐波拉契數列題目,很自然會想到使用遞迴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;
}