这个题一上就想到打表,虽然OJ中很少出打表的题,但是很懒还是抱着侥幸心理试了试,结果真的过了。
打表:先在网上找了前五十个斐波那契数,但那是用空格隔开的,所以先写个小程序将空格换成了逗号,肯定比自己手动换快。
然后放到程序中,用longlong型数组保存,再需要那个输出哪个就行了。
AC代码1:
#include <stdio.h> #include <stdlib.h> void fun() { long long fei[55]={1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368,75025,121393,196418,317811,514229,832040,1346269,2178309,3524578,5702887,9227465,14930352,24157817,39088169,63245986,102334155,165580141,267914296,433494437,701408733,1134903170,1836311903,2971215073,4807526976,7778742049,12586269025}; int i; if(scanf("%d",&i)==EOF) return; printf("%lld\n",fei[i-1]); fun(); return; } int main() { fun(); return 0; }
之后很多同学出现“运行错误”或“时间超限”,这个原因很简单,运行错误是因为int型变量根本存不了类似于1134903170这么大的数。
请大家记住,倘若数据在9位数(2^32)以下,可以用int。其他用longlong。
“时间超限”:就是因为递归太多了。那就稍微优化一下就可以过,不要输入一次,就计算一次输出,而应一次把45个斐波那契数都计算出来,保存到数组中,然后需要哪个输出哪个。这种方法是推荐使用的,因为考试没法用第一种方法的。
AC代码2:
#include <stdio.h> #include <stdlib.h> long long a[50]={0}; void fib(int n) { if (n==50) return; a[n]=a[n-1]+a[n-2]; fib(n+1); } void print() { int index; if (scanf("%d",&index)!=EOF) { printf("%lld\n",a[index]); print(); } return; } int main() { a[0]=0; a[1]=1; fib(2); print(); return 0; }