Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。 当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。

类型一:(先计算出Fn的准确值,再将计算的结果除以10007取余数)

方式一:非递归方法

import java.util.Scanner;

public class Test2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();

        long num1 = 1;
        long num2 = 0;
        long sum = 0;

        for (int i = 0; i < n; i++) {
            sum = num1 + num2;
            num1 = num2;
            num2 = sum;
            System.out.println(i + ":" + sum);
        }

        System.out.println(sum);
        System.out.println(sum % 10007);
    }
}

  不管使用long类型或者int类型,结果都会溢出(使用long类型,在n=94时就会溢出):

方式二:递归方式

import java.util.Scanner;

public class Test2{
    public static void main(String args[]){
      Scanner in = new Scanner(System.in);
      int n = in.nextInt();
      System.out.println(F(n)%10007);
    }
    public static int F(int x){
      if(x==1||x==2)
      return 1;
    else
      return F(x-1)+F(x-2);
    }
}

会导致堆栈的溢出

类型二:(直接计算余数)

方式一:

import java.util.Scanner;

public class Test2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();

        long num1 = 1;
        long num2 = 0;
        long sum = 0;

        for (int i = 0; i < n; i++) {
            sum = (num1 + num2) % 10007;
            num1 = num2;
            num2 = sum;
        }

        System.out.println(sum);
    }
}

方式二:

import java.util.Scanner;

public class Test2{
  public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] F = new int[n+2];
        F[1] = 1;
        F[2] = 1;
        if(n > 2){
            for (int i = 3; i <= n; i++) {
                F[i] = (F[i-1] + F[i-2]) % 10007;

            }
        }
        System.out.println(F[n]);
    }      
}

 

posted @ 2020-12-24 09:41  '--'  阅读(548)  评论(0)    收藏  举报