Fibonacci数列java

蓝桥杯算法练习(java篇)

  • 入门
    • Fibonacci数列

入门

Fibonacci数列

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

输入格式:
输入包含一个整数n。

输出格式:
输出一行,包含一个整数,表示Fn除以10007的余数。

样例输入:10
样例输出:55
样例输入:22
样例输出:7704

源码:

import java.util.Scanner;
public class Main{
static long n=0,F1=1,F2=1,Fn=1;
public static void main(String[] args) {
	Scanner scanner=new Scanner(System.in);
    n=scanner.nextLong();
    for(long i=3;i<=n;i++) {
    	Fn=(F1+F2)%10007;
    	F1=F2;
    	F2=Fn;
    }
    System.out.println(Fn);
}
}

Fn=F1+F2;
F1=F2;
F2=Fn;
即计算出了Fn的值再进行取余的操作,但是在计算Fn的过程中,当Fn的值太大时不足以用longlong类型的变量支撑,造成了计算机内的二进制溢出,导致例如在n为666的时候结果为负数。Double支撑的数比较大,但是在取余的结果是整数,在强制转化为整形的时候容易因为小数进位而造成结果有所偏差。
Fn=(F1+F2)%10007;
F1=F2;
F2=Fn;
F1,F2表示的是n等于n-1和n-2时的结果。
因为求余数的时候其实每次只要满10007就可以取余,那么取余的操作可以叠加,这样每次得到的结果都比较小,可以让longlong类型支撑,且能得到正确的结果。

你可能感兴趣的:(算法)