蓝桥杯基础训练Fibonacci数列
蓝桥杯基础训练Fibonacci数列
蓝桥杯基础训练Fibonacci数列
问题描述
Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。
当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。
题目分析
一开始是用递归做的。
long fibonacci(long n){
if(n<=2) return 1;
return (fibonacci(n-1)+fibonacci(n-2))%10007;
}
递归好啊,不用想这么多。一看到题目就想用递归来做,结果提交显示运行时间超时了,毕竟时间复杂度O(2^n)。非递归的算法时间复杂度为O(n)。题目要求菲波那切数列对10007的余数,可以将每项斐波那契数对10007的余数求出再相加再求余,对于计算时间可以大大减少。
import java.util.*;
public class Main{
public static void main(String[] args) {
int[] a=new int[10000000];
int number_p=10007;
a[0]=a[1]=1;
Scanner scanner=new Scanner(System.in);
int number=scanner.nextInt();
if(number==1 || number==2){
System.out.println(a[0]);
}else{
for (int i = 2; i <number; i++){
a[i]=(a[i-1]+a[i-2])%number_p;
}
System.out.println(a[number-1]);
}
}
}
还没有评论,来说两句吧...