目录
一、题目
二、思路
1、斐波那契数列
2、返回最后6位
三、代码
详细注释版本:
简化注释版本:
一、题目
菲波那契凤尾 题目链接:菲波那契凤尾
NowCoder号称自己已经记住了1-100000之间所有的斐波那契数。为了考验他,我们随便出一个数n,让他说出第n个斐波那契数。当然,斐波那契数会很大。因此,如果第n个斐波那契数不到6位,则说出该数;否则只说出最后6位。
输入描述:
输入有多组数据。
每组数据一行,包含一个整数n (1≤n≤100000)。输出描述:
对应每一组输入,输出第n个斐波那契数的最后6位。示例1
输入
12
3
4
100000
输出
12
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);
}
}
}
}