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]); } }
                    
                
                
            
        
浙公网安备 33010602011771号