水题 大数fibs数列+二分查找。。。

#include <cstring>
#include <cstdio>
#define N 500

char s[N][N];
char s2[110],str[110];
void ans(int *a, int *b)
{
    for(int i=0; i<N; ++i)
        a[i]=b[i];
}
void _ans(char *s, int *a)
{
    int k=N-1;
    int j=0;
    for(; k>=0; --k)
        if(a[k]) break;
    for(int i=k; i>=0; --i) s[j++]=a[i]+'0';
}
void solve()
{
    int a[N];
    int b[N];
    int c[N];
    memset(a, 0, sizeof(a));
    memset(b, 0, sizeof(b));
    memset(c, 0, sizeof(c));
    memset(s, 0, sizeof(s));
    a[0]=1;
    b[0]=2;
    s[0][0]='1';
    s[1][0]='2';
    for(int i=2; i<N; ++i)
    {
        int m=0;
        for(int j=0; j<N; ++j)
        {
            c[j]=a[j]+b[j]+m;
            m=c[j]/10;
            c[j]=c[j]%10;
        }
        _ans(s[i],c);
        ans(a,b);
        ans(b,c);
    }
}
bool pan(int a, char *str)
{
    int len=strlen(s[a]);
    int len2=strlen(str);
    if(len>len2) return false;
    else if(len<len2) return true;
    else
    {
        if(strcmp(s[a],str)<=0) return true;
        return false;
    }
}
int finds(char *str)
{
    int l=0,r=N-1,mid;
    while(l<r)
    {
        mid=(l+r)/2;
        if(!strcmp(s[mid],str)) return mid;
        if(pan(mid,str)) l=mid+1;
        else r=mid;
    }
    return l;
}
int main()
{
    solve();
    while(scanf("%s %s",s2,str)==2)
    {
        if(!strcmp("0",s2) && !strcmp("0",str))
            return 0;
        int a=finds(s2);
        int b=finds(str);
//        printf("%d %s\n",a, s[a]);
//        printf("%d %s\n",b,s[b]);
        if((!strcmp(s[a],s2) && !strcmp(s[b],str)) || (strcmp(s[a],s2) && !strcmp(s[b],str))) a--;
        printf("%d\n",b-a);
    }
    return 0;
}
View Code

 

posted on 2013-11-07 20:36  风流monkey  阅读(127)  评论(0编辑  收藏  举报