1. 程式人生 > >[南陽OJ-No.13]Fibonacci數|無窮數列1,1,2,3,5,8,13,21,34,55...稱為Fibonacci數列,它可以遞迴地定義為 F(n)=1 ...........(n=1或

[南陽OJ-No.13]Fibonacci數|無窮數列1,1,2,3,5,8,13,21,34,55...稱為Fibonacci數列,它可以遞迴地定義為 F(n)=1 ...........(n=1或

南陽OJ-No.13

時間限制:3000ms,空間限制:65535KB

描述

無窮數列1,1,2,3,5,8,13,21,34,55…稱為Fibonacci數列,它可以遞迴地定義為
F(n)=1 ………..(n=1或n=2)
F(n)=F(n-1)+F(n-2)…..(n>2)
現要你來求第n個斐波納奇數。(第1個、第二個都為1)

輸入

第一行是一個整數m(m<5)表示共有m組測試資料
每次測試資料只有一行,且只有一個整形數n(n<20)

輸出

對每組輸入n,輸出第n個Fibonacci數

樣例輸入

3
1
3
5

樣例輸出

1
2
5

java

**時間46,記憶體311**

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        int a = cin.nextInt();
        int temp;

        for (int n=0; n<a; n++) {
            temp = cin.nextInt();

            System.out
.println(Fibonacci(temp)); } } public static int Fibonacci(int n) { if (n == 1) { return 1; }else if (n == 2){ return 1; } else { return Fibonacci(n-1) + Fibonacci(n-2); } } }

**時間25,記憶體311**

import java.util.Scanner;

public
class Main { public static void main(String[] args) { Scanner cin = new Scanner(System.in); int a = cin.nextInt(); int temp; for (int n=0; n<a; n++) { temp = cin.nextInt(); System.out.println(Fibonacci(temp)); } /***/ cin.close(); /***/ } public static int Fibonacci(int n) { if (n == 1) { return 1; }else if (n == 2){ return 1; } else { return Fibonacci(n-1) + Fibonacci(n-2); } } }

主動關閉Scanner流會節省時間!!!

**時間24,記憶體311**

import java.util.Scanner;

public class Main_13 {

    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        int a = cin.nextInt();
        int temp;

        while (a>0) {
            temp = cin.nextInt();

            System.out.println(Fibonacci(temp));
            a--;
        }

        cin.close();
    }

    public static int Fibonacci(int n) {
        if (n == 1) {
            return 1;
        }else if (n == 2){
            return 1;
        } else {
            return Fibonacci(n-1) + Fibonacci(n-2);
        }
    }
}

將for改成while節省1時間!!!

**時間3,記憶體61**
依舊是使用者名稱為 Bryan 的一大神給出的演算法,投幣看程式碼~

import java.util.Scanner;

public class Main {
    public static Scanner cin=new Scanner(System.in);

    public static void main(String[] args) {
        int line = 0;
        int number = cin.nextInt();

        for(int i = 0; i < number; i++){    
            line = cin.nextInt();
            System.out.println(f(line));
        }
    }

    static int f(int i){
        if (i <= 2 && i >= 0 ) {
            return 1;
        }
        return f(i - 1) + f(i - 2);
    }
}

將資料轉換為 static 型別的重要性!!!(且Scanner主動關閉與否不影響時間)

**時間1,記憶體61**
Google出來的算是最高效的演算法了,2017.2.3標記下,看不懂~

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main{
    public static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    public static void main(String[] args) throws IOException{
        int lineNum = Main.readInt();
        int f1 = 1;
        int f2 = 1;
        int fn = 0;
        for(int i = 0; i < lineNum; i++){
            int num = Main.readInt();
            if(num <= 2){
                System.out.println(f1);
            }else{
                f1 = 1;
                f2 = 1;
                for(int j = 3; j <= num; j++){
                    fn = f1 + f2;
                    f1 = f2;
                    f2 = fn;
                }
                System.out.println(fn);
            }
        }
        in.close();
    }
    public static int readInt() throws IOException{
        String str = in.readLine();
        int num = Integer.parseInt(str);
        return num;     
    }
}

c++

時間0,記憶體240

#include<iostream> 
using namespace std;

int f(int i)
{
    if (i <= 2 && i >= 0 ) {
        return 1;
    }
    return f(i - 1) + f(i - 2);
}

int main()
{
  int a;
  cin >> a;
  int temp;

  for(int i = 0; i < a; i++){   
        cin >> temp;
        cout << f(temp) << endl;
    }
}