蓝桥杯试题集-入门题-Fibonacci数列
来人啊上题目!
题目:
最初解题姿势:(也是错误姿势)
import java.util.*;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input=new Scanner(System.in);
int n=input.nextInt();
fibonacci(n);
}
private static void fibonacci(int n) {
// TODO Auto-generated method stub
int presum=0,rearsum=0,tmpsum=0,i=1;
rearsum=presum=i;
if (n==1||n==2){
System.out.println(1);
}else {
i=2;
while(i!=n) {
tmpsum=rearsum+presum;
presum=rearsum;
rearsum=tmpsum;
i++;
}
if(i==n) {
System.out.println(rearsum%10007);
}
}
}}
//我是直接去计算Fn这个值,然后对10007取余,后果是由于用int早就由于数据过大溢出了,100分只拿了30分
然后我用long代替int ,没想到还是溢出啦,不过这次100分拿了40分哈哈哈,
然后我又分析啊,测试发现不管你用什么基本类型都装不下当n=1000000时的那个Fn结果,于是我又改用了bigInteger这个能装超大型数据的类型,这次100分拿了90分,为什么没有拿下100,因为当计算出n=100000这个位置的Fn值时已经超时了!此时的Fn值巨大,于是尽管能通过其他9个测试用例,但是超时这个要求依然存在,于是最高只能得90分
接下来才是正确的100分姿势:
import java.util.*;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input=new Scanner(System.in);
int n=input.nextInt();
fibonacci(n);
}
private static void fibonacci(int n) {
// TODO Auto-generated method stub
int presum=0,rearsum=0,tmpsum=0,i=1;
rearsum=presum=i;
if (n>2) {
i=2;
while(i!=n) {
tmpsum=(rearsum+presum)%10007;
presum=rearsum;
rearsum=tmpsum;
i++;
}
}
System.out.println(rearsum);
}
}
//这个是直接及时对10007取余才保证没有溢出的现象,哪怕你用int型,这样跟算出最后Fn的值在对10007取余的结果都是一样的(如果你有对取余的做题经验你就知道了,而我就不知道,于是我走了上面那些弯路哈哈哈哈哈,太真实了)
其实题目已经有自可意会不可言传之意了,
哈哈哈