蓝桥杯试题集-入门题-Fibonacci数列(java)

蓝桥杯试题集-入门题-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取余的结果都是一样的(如果你有对取余的做题经验你就知道了,而我就不知道,于是我走了上面那些弯路哈哈哈哈哈,太真实了)
其实题目已经有自可意会不可言传之意了,
在这里插入图片描述

哈哈哈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值