当前位置 博文首页 > 邱天的henry的博客:蓝桥杯:入门训练 Fibonacci数列(java实现

    邱天的henry的博客:蓝桥杯:入门训练 Fibonacci数列(java实现

    作者:[db:作者] 时间:2021-07-19 13:24

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

    输入格式
    输入包含一个整数n。
    输出格式
    输出一行,包含一个整数,表示Fn除以10007的余数。
    说明:在本题中,答案是要求Fn除以10007的余数,因此我们只要能算出这个余数即可,而不需要先计算出Fn的准确值,再将计算的结果除以10007取余数,直接计算余数往往比先算出原数再取余简单。

    样例输入
    10
    样例输出
    55
    样例输入
    22
    样例输出
    7704
    数据规模与约定
    1 <= n <= 1,000,000。


    方法一:使用递归


    import java.util.Scanner;
    
    public class Main {
    	/*Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。
    	当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。*/
    	public static void main(String[] args) {
    		//接收控制台的输入
    		Scanner sc=new Scanner(System.in);
            //获取输入的数字
    		int n=sc.nextInt();
    		//调用sum处理结果
    		int mod=sum(n)%10007;
    		System.out.println(mod);
    	}
    	public static int sum(int n) {
    		if(n==1 ||n ==2) {
    			return 1;
    		}else {
    			return sum(n-1)+sum(n-2);
    		}
    	}
    }
    

    ps:方法一容易超时


    方法二:使用迭代


    import java.util.Scanner;
    public class Main {
    	public static void main(String[] args) {
    		Scanner sc=new Scanner(System.in);
            int n=sc.nextInt();
            //创建一个数组来存放余数,并指定其长度
            //长度为n+2是为了存放所有的n且包括n之前对10007的所有余数(数组从f[0]开始,并要存放f[1]和f[2],如果n=1的话,数组的长度为3)
            int []f=new int[n+2];
            //定义n=1和n=2的时候余数为1
            f[1]=1;
            f[2]=1;
            if(n>2) {
            	for(int i=3;i<=n;i++) {
            		//使用数组f来存放余数,比总和求出来在求余节省了时间
            		f[i]=(f[i-1]+f[i-2])%10007;
            	}
            }
            System.out.println(f[n]);
    	}
    
    }
    

    ps:递归虽然可以解决一些复杂的代码,但时间的使用较高,在调用函数的同时也较浪费空间,此题在考虑到时间的问题上,使用迭代更合适。

    cs