您的位置:首页 > 其它

SDUST_OJ-1608-斐波那契数列

2014-12-28 09:08 120 查看
这个题一上就想到打表,虽然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
=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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: