蓝桥杯 入门训练 Fibonacci数列
问题分析:
求出斐波那契数列中的第n项并除以10007取余,因为斐波那契数列每一项是前两项相加,所以求得的每一项可以先判断是否大于10007,如果大于,则减去10007,这样可以避免当n很大时,数据过大;
如果用递归来求(第一个函数),当n加一,运行时间几乎变为两倍,n比较大时(大于50),运行时间就过长;
第二函数是正方向算斐波那契数列,耗时短,且判断r是否大于10007,以此避免数据过大(此题最后一个输入数据是999999)
```java
在这里插入代码片
import java.util.Scanner;
public class Fibonacci数列 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
long n=sc.nextInt();
long startTime = System.currentTimeMillis(); //获取开始时间
System.out.println(S(n));
long endTime = System.currentTimeMillis(); //获取结束时间
System.out.println("程序运行时间:" + (endTime - startTime) + "ms"); //输出程序运行时间
}
//通过递归得出第n个斐波那契数列,但n大时,耗时长
public static long Fibonacci(long n) {
if(n==1 || n==2) {
return 1;
}
else {
return Fibonacci(n-1)+Fibonacci(n-2);
}
}
//正向算斐波那契数列,并且减去10007避免数字过大
public static long S(long n) {
if(n==1 || n==2) {
return 1;
}
else {
long i=1;
long j=1;
long r=0;
long count=3;
while(true) {
r=i+j;
if(r/10007>0) {
r=r-10007;
}
if(count==n) {
return r;
}
else {
i=j;
j=r;
count++;
}
}
}
}
}
心得:
1、整数数据类型有范围
int 数据类型是32位、有符号的以二进制补码表示的整数;
最小值是 -2,147,483,648(-2^31);
最大值是 2,147,483,647(2^31 - 1);
大约正负20亿,数据大时应用long
long 数据类型是 64 位、有符号的以二进制补码表示的整数;
最小值是 -9,223,372,036,854,775,808(-2^63);
最大值是 9,223,372,036,854,775,807(2^63 -1);
例子: long a = 100000L,Long b = -200000L。(后面加L,float类型后面加f)
"L"理论上不分大小写,但是若写成"l"容易与数字"1"混淆,不容易分辩。所以最好大写。
2、递归算法要慎用,数据大时耗时长
3、下面的代码可以计算程序运行时间
long startTime = System.currentTimeMillis(); //获取开始时间
//此处是代码块
long endTime = System.currentTimeMillis(); //获取结束时间
System.out.println("程序运行时间:" + (endTime - startTime) + "ms"); //输出程序运行时间