入门训练 Fibonacci数列

记录一下我的蓝桥杯的进击之路

	今年报名了蓝桥杯比赛(Java组)所以从今天开始每天抽时间写一题的博客
	从入门级别的开始(所有题都是在蓝桥杯官网上的练习系统上的)
	话不多说直接开搞。

先看一下今天的题

入门训练 Fibonacci数列

 问题描述

Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。

当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。
输入格式
输入包含一个整数n。
输出格式
输出一行,包含一个整数,表示Fn除以10007的余数。 
 样例输入
10
样例输出
55
样例输入
22
样例输出
7704
数据规模与约定
1 <= n <= 1,000,000。

开始解题
我看到这个题的第一眼我就心里有了底了这不就是一个斐波那契数列么不愧是入门级别的题毫无挑战难度
分析一下这题
题目告诉了我们递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。
所以当n=1,n=2的时候结果都是1,故此我们知道了这个题的等价关系
废话少说直接上代码`:

public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		System.out.println(F(sc.nextInt())%10007);
	}
	static int F(int n) {
		if (n==1||n==2) {
			return 1;
		}else {
			return F(n-1)+F(n-2);
		}
	}

在eclipse上测试了几组样例后得到的结果与示例给出的一致,于是我提交到了蓝桥杯官网上,结果竟然出乎意料我居然只得到了30分,,,,,
纳林,什么情况???
在这里插入图片描述看到评测结果我也很无奈呀前三次测试基数小还能通过验证后面可能基数大了导致cpu运行超时。。
我想了一下,代码是确定能够算出来的没有问题 但是问题出在我用的方法上面,我这串代码是利用了递归思想简单明了直接暴力求值,但是当基数大一点的时候
这运行速率不行了(这就很不爽了)
重新整理了一下思路不用递归我再写了一次
思路————》我们使用数组来保存%10007后的余数这样就避免了重复计算值了(深刻体会到了递归的强大后想到的)

public static void main(String[] args) {
		// TODO Auto-generated method stub	
		Scanner sc=new Scanner(System.in);
		int N=sc.nextInt();
		int[] a=new int[N+2];
		a[1]=1; 
		a[2]=1;
		if (N>2) {
			for (int i = 3; i <= N; i++) {
				a[i]=(a[i-1]+a[i-2])%10007;
			}
			System.out.println(a[N]);
		}else {
			System.out.println(1%10007);
		}
			
	}
	

果不其然,这次系统给了我满分 哈哈哈!!!
在这里插入图片描述

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值