蓝桥与力扣刷题(蓝桥 数列求值)
题目:给定数列 1,1,1,3,5,9,17,⋯,从第 4 项开始,每项都是前 3 项的和。
求第 20190324 项的最后 4 位数字。
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
解题思路+代码:
代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.StringTokenizer;
public class 数列求值 {
public static void main(String[] args) throws IOException {
int t = 1;
for (int i = 1; i <= t; i++) {
solve();
}
out.flush();
}
static void solve(){
int n = 20190324;
long backFour = fibonacci(n); //只获取后四位数
out.println(backFour);
}
//创建斐波那契数列求和方法
public static long fibonacci(int n){
if(n<=0){
return 0;
}
if(n==1){
return 1;
}
long a = 1; //F(1)
long b = 1; //F(2)
long c = 1; //F(3)
//从第4项开始
for(int i = 4; i<=n; i++){
long d =( a + b + c) % 10000; //避免溢出
//重新赋值,相当于a、b、c全部后移
a = b;
b = c;
c = d;
}
return c;//返回第n项的值
}
static FastReader in = new FastReader();
static PrintWriter out = new PrintWriter(System.out);
static class FastReader{
BufferedReader br;
StringTokenizer st;
FastReader(){
br = new BufferedReader(new InputStreamReader(System.in));
}
String next(){
String str = "";
while(st == null || !st.hasMoreElements()){
try{
str = br.readLine();
}catch (IOException e){
throw new RuntimeException(e);
}
st = new StringTokenizer(str);
}
return st.nextToken();
}
int nextInt(){
return Integer.parseInt(next());
}
double nextDouble(){
return Double.parseDouble(next());
}
long nextLong(){
return Long.parseLong(next());
}
}
}
总结:这道题是求斐波那契数列中第n项的值,不过这道题加了一个要求(第n项值的后四位数)。传统的斐波那契数列是1,1,2,3,5,8,13……(从第3项开始是前两项的和),在本题中稍微改了一下是从第4项开始是前三项的和,但这并不影响解答该题。有一个关键点:求第20190324项值会造成数值溢出,因此需要%10000来避免溢出并输出值的后四位。(附加解释:这里面求解斐波那契数列值的后四位并不需要这么长段的代码,但这里面做了快读的操作,提高了读取数据的效率)。