SDUST_OJ-1608-斐波那契数列

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


 

你可能感兴趣的:(SDUST_OJ-1608-斐波那契数列)