《菲波那契凤尾》:菲波那契数列,返回最后6位

目录

一、题目

二、思路

1、斐波那契数列

2、返回最后6位

 三、代码

详细注释版本:

简化注释版本:


一、题目

菲波那契凤尾     题目链接:菲波那契凤尾

        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

二、思路

1、斐波那契数列

2、返回最后6位

        返回有格式要求,即如果斐波那锲数 的位数小于 6 位,就直接返回;如果超过了6 位,就返回最后 6 位。

        我们可以在初始化斐波那锲数列数组的时候就进行相应的处理,即 % 1000000 。

         因此使用 printf 格式化输出。

%d :正常输出十进制数 。

%Yd:十进制数,输出 Y 位。如果本身大于 Y 位,正常输出。

%XYd:十进制数,输出 Y 位,不足 Y 位就补 X 。如果本身大于 Y 位,正常输出。

%d:十进制数正常输出 。

%2d:十进制数,输出 2 位。如果本身大于 2 位,正常输出。

%02d :十进制数,输出 2 位,不足 2 位就补 0 。如果本身大于 2 位,正常输出。

 注意:

        题目中要求的不满6位的直接输出这个数字,而不是前面是空格。因此我们还要进行分类讨论,讨论什么时候斐波那锲数小于 6 位,什么时候斐波那锲数大于6位。  

 三、代码

        注意在写代码的过程中,构造斐波那锲数列的代码不能放在 while输入循环中,否则每次输入一个数,就要再重新构造一个 100000 个数的斐波那锲数列。会使运行时间大大增加。导致提交不成功,显示超时。

详细注释版本:

import java.util.Scanner;
/**
 * Created with IntelliJ IDEA.
 * Description:菲波那契凤尾
 * User: WangWZ
 * Date: 2023-04-13
 * Time: 12:49
 */
public class Main {
    public static void main(String[] args) {
        //注意:在输入外面构建一个菲波那契数列
        //因为要判断什么时候数小于6 位,什么时候大于6位
        //所以设置一个边界值,当边界值改变时,就说明数已经大于 6 位了
        int border = -1;
        //先生成 100000的斐波那锲数列
        long[] arr = new long[100000];
        arr[0] = 1;
        arr[1] = 2;
        for(int i = 2; i < 100000;i++) {
            long m = arr[i - 1] + arr[i - 2];
            //对 m 值进行判断,如果 m 值大于6 位了,说明边界需要发生改变
            //border记录的是第几个数字开始就大于6位了
            //所以是 i + 1
            //第一个数: 下标 0
            //第二个数: 下标 1
            //第 i 个数:下标 i - 1
            //倒过来就是,已知下标 i 的元素,则它就是第 i + 1个元素。
            //注意只用在第一次遇到大于6位的时候进行改变,因为后面的肯定也都大于6位
            //所以判断条件中要加上 boeder == -1
            if(border == -1 && m >= 1000000) {
                border = i + 1;
            }
            //因为只需要后 6 位,所以可以使用 % 100000 来只保存后6位
            arr[i] = m % 1000000;
        }
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNextInt()) {
            int n = scanner.nextInt();
            long ans = arr[n - 1];
            if(n < border) {
                //说明小于等于6位,直接输出
                System.out.printf("%d\n",ans);
            } else {
                System.out.printf("%06d\n",ans);
            }

        }
    }
}

简化注释版本:

import java.util.Scanner;
/**
 * Created with IntelliJ IDEA.
 * Description:菲波那契凤尾
 * User: WangWZ
 * Date: 2023-04-13
 * Time: 12:49
 */
public class Main {
    public static void main(String[] args) {
        //所以设置一个边界值,当边界值改变时,就说明数已经大于 6 位了
        int border = -1;
        //斐波那锲数列
        long[] arr = new long[100000];
        arr[0] = 1;
        arr[1] = 2;
        for(int i = 2; i < 100000;i++) {
            long m = arr[i - 1] + arr[i - 2];
            //对 m 值进行判断,如果 m 值大于6 位了,说明边界需要发生改变
            if(border == -1 && m >= 1000000) {
                border = i + 1;
            }
            //因为只需要后 6 位,所以可以使用 % 100000 来只保存后6位
            arr[i] = m % 1000000;
        }
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNextInt()) {
            int n = scanner.nextInt();
            long ans = arr[n - 1];
            if(n < border) {
                //说明小于等于6位,直接输出
                System.out.printf("%d\n",ans);
            } else {
                System.out.printf("%06d\n",ans);
            }

        }
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值