蓝桥杯 入门训练 Fibonacci数列

蓝桥杯 入门训练 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");    //输出程序运行时间
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值