SDUST_OJ-1608-斐波那契数列

来源:互联网 发布:淘宝金币抵扣怎么设置 编辑:程序博客网 时间:2024/05/21 11:00

这个题一上就想到打表,虽然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;}


 

0 0
原创粉丝点击