C 列一列

题意:小W在计算一个数列{An},其中A1=1,A2=2,An+2=An+1+An。输入数列中的某一项,输出该项是是数列的第几项。

思路:这里用的是取模来存的思想,Hash一样来存。

对于unsigned整型溢出,C的规范是有定义的——“溢出后的数会以2^(8*sizeof(type))作模运算”,也就是说,如果一个unsigned char(1字符,8bits)溢出了,会把溢出的值与256求模。

对于signed整型的溢出,C的规范定义是“undefined behavior”,也就是说,编译器爱怎么实现就怎么实现。对于大多数编译器来说,算得啥就是啥。

让它自然溢出就相当于取模了,这里很迷,long long 溢出后似乎也是取模的,试了一下似乎是这样的。

不行的话就用1e9+7来模,不过似乎会有冲突,可以特判或者找两个数来模,如果两个结果都符合的话,就可以了。

long long f[1000010];
char a[100010];
void init()
{
    f[1]=1;f[2]=2;
    for(int i=3;i<=1000000;i++)
    {
        f[i]=f[i-2]+f[i-1];
        //printf("%lld ",f[i]);
    }
}
int main()
{
    init();
    while(scanf("%s",a)!=EOF)
    {
        long long aa=0;
        for(int i=0;i<strlen(a);i++)
            aa=aa*10+a[i]-'0';
        for(int i=0;i<=1000000;i++)
            if(f[i]==aa)
            {
                printf("%d\n",i);
                break;
            }
    }
    return 0;
}

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

POJ 1696 极角排序 Previous
计算几何 Next