ZCMU 1347: 又是斐波那契数列

1347: 又是斐波那契数列

Time Limit: 1 Sec  Memory Limit: 128 MB

Submit: 592  Solved: 203

Description

在数学中斐波那契数列F是这样定义的:F(n)=F(n-1)+F(n-2),F(0)=1,F(1)=1。现在我有另外一个序列G,G(n)=G(n-1)+G(n-2),G(0)=1,G(1)=t(t>=1)。

你的任务对于给定的i,G(i)和j输出G(j)。

Input

多组测试数据,对于每组测试数据包含三个正整数i,G(i),j。1 <= i,j <=20, G(i)<100000。

Output

对于每组数据,如果t存在输出对应的G(j)的值,否则输出-1。

Sample Input

1 1 2

3 5 4

3 4 6

12 17801 19

Sample Output

2

8

-1

516847

题解:之前看到这样的题目是一点也不想做的感觉,规律其实很好找。把题目给的数据带进去算一下就能发现下表。不过建议不要用斐波那契数列作为系数,会导致后来的分类讨论比较麻烦。



找出公式g[i]=f(i-1)*t+f(i-2);

t=1.0*(g[i]-f(i-2))/f(i-1));

根据题目讲的输入为三个正整数可知,g[i]为正整数,而t属于g[i],那么判断条件就是如果t不是整数,输出-1.(这里卡了我好久QQ)。

关于判断t是否为整数的办法:判断被除数%除数是否为0,如果为0,说明整除。(昨晚肯定是傻了这里也卡了)。

hz同学告诉我说用(int)t==t这种判断方法并不好,精度问题。

还有一种判断方法也不行,就是*10之后取整再%10,如果t=1.01则不行。

但是题目交了一遍又一遍,之前是runtime error(没有判断i不等于1的时候j如果等于1的情况,输入5 8 1 没有输出),后来是WA,测试数据(输入1 0 1  输出-1)坑了我QQ

代码:

#includelong long f(long long n) //斐波那契数列

{

    if(n==0)

        return 1;

    if(n==1)

        return 1;

    return f(n-1)+f(n-2);

}

int main()

{

    int i,g,j;

    double t;

    while(~scanf("%d%d%d",&i,&g,&j))

    {

        if(i<1||i>20||j<1||j>20||g>100000)

            break;

        if(i==1)

        {

            t=g;

            if(j==1 && t>=1)  //需要判断t>=1

            {

                printf("%d\n",g);

            }

            else if(t>=1)

                printf("%.f\n",f(j-1)*t+f(j-2));

            else

                printf("-1\n");

            //continue;  某学长说要吃bazhang?

        }

        else

        {

            t=1.0*(g-f(i-2))/f(i-1);

            //long long flag=(long long)(t*10);

            //flag%=10;

            //printf("t is %.2f\n",t);

            //printf("flag is %d\n",flag);

          // int flag=0;

          // if((int)t!=t)

            //    flag=1;

            if(((g-f(i-2))%f(i-1)==0)&&t>=1)//说明t是整数

            {

                if(j==1)    //忘记考虑的情况

                {

                    printf("%.f\n",t);

                }

                else

                    printf("%.f\n",f(j-1)*t+f(j-2));

            }

            else

            {

                printf("-1\n");

            }

        }

    }

    return 0;

}

你可能感兴趣的:(ZCMU 1347: 又是斐波那契数列)