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

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

《菲波那契凤尾》:菲波那契数列,返回最后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 == -1if(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);}}}
}