斐波那契凤尾 --- 遇到的坑

Posted 满眼*星辰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了斐波那契凤尾 --- 遇到的坑相关的知识,希望对你有一定的参考价值。

斐波那契凤尾

NowCoder号称自己已经记住了1-100000之间所有的斐波那契数。
为了考验他,我们随便出一个数n,让他说出第n个斐波那契数。当然,斐波那契数会很大。因此,如果第n个斐波那契数不到6位,则说出该数;否则只说出最后6位。

输入描述:
输入有多组数据。
每组数据一行,包含一个整数n (1≤n≤100000)。

输出描述:
对应每一组输入,输出第n个斐波那契数的最后6位。
示例1
输入
1
2
3
4
100000
输出
1
2
3
5
537501

链接:https://www.nowcoder.com/questionTerminal/c0a4b917a15f40a49ca10532ab9019fb
来源:牛客网

坑1

这个是我觉得没啥问题的代码

import java.util.*;
 
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while(in.hasNext()) {
            int n = in.nextInt();
            int a = 1;
            int b = 2;
            int count = 2;
            int c = 0;
            if(n == 1) {
                System.out.println(1);
            }else if(n == 2) {
                System.out.println(2);
            }else {
                while(count < n) {
                    c = (a+b)%1000000;
                    a = b;
                    b = c;
                    count++;
                }
                System.out.println(c);
            }
        }
    }
}

这个代码是会运行超时的

原因就是测试用例太对,每次都要执行这个大的循环

解决坑1

对于这样类似的题目,最好的方式是进行预处理,把要计算的数值进行第一次计算的时候存储下来,然后剩下的测试用例只进行查找即可,因为查找比计算更加高效,再加上一次运算总比次次运算要快。不要担心第一次计算那么大数值时候回超时,因为这个数量级的运算还是很快的。

import java.util.*;
 
public class Main {
    public static int[] fid = new int[100001];
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        fiding(fid.length);
        while(in.hasNext()) {
            int n = in.nextInt();
            System.out.println(fid[n]);
        }
    }
    public static void fiding(int n) {
        fid[0] = 1;
        fid[1] = 1;
        int i = 2;
        while(i < n) {
            fid[i] = (fid[i-1] + fid[i-2])%1000000;
            i++;
        }
    }
}

坑2

这里比如 n = 37这个测试用例,预期输出应该是 088169 ,但是这个代码输出是 88169,因为是取余的,所以 0 会没有,所以我们需要对输出进行处理

解决坑2

如果大的数字,需要给前面补0,则可以这么写String.format("%06d",fid[n])

这样保证6位数,不到6位数前面补0

完整代码

import java.util.*;
  
public class Main {
    public static int[] fid = new int[100001];
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        fiding(fid.length);
        while(in.hasNext()) {
            int n = in.nextInt();
            if(n < 25){
                System.out.println(fid[n]);
            }else {
                System.out.println(String.format("%06d",fid[n]));
            }
        }
    }
    public static void fiding(int n) {
        fid[0] = 1;
        fid[1] = 1;
        int i = 2;
        while(i < n) {
            fid[i] = (fid[i-1] + fid[i-2])%1000000;
            i++;
        }
    }
}

以上是关于斐波那契凤尾 --- 遇到的坑的主要内容,如果未能解决你的问题,请参考以下文章

斐波那契数列 : 斐波那契凤尾

斐波那契数列 : 斐波那契凤尾

斐波那契数列 : 斐波那契凤尾

斐波那契凤尾

每日一题 | day32(斐波那契数列凤尾)

08《算法入门教程》递归算法之斐波那契数列