入门训练 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); } }
果不其然,这次系统给了我满分 哈哈哈!!!
下一篇:
斐波那契数列递归解法