【HDU】 1316 How Many Fibs?

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1316

请参见我的另一篇博文,本题是在HDU 1715的基础上拓展了。我的做法是将打表结束的Fibonacci数转化成字符串,然后采用字符串比较方式做。

而奇怪的是,这道题在oj上显示是0MS,而1715那个是31MS...  额,我不说话了... 

 

#include <iostream>
#include <map>
#include <cmath>
#include <cstring>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <queue>
#include <algorithm>
#include <ctime>
#include <iomanip>
#define in freopen("in.txt","r",stdin)
#define ou freopen("gou.txt","w",stdout)
#define INF_MAX 0x7FFFFFFF
#define MARK  1e-5
#define MAXN 1010
using namespace std;
int f[MAXN][MAXN],  len[MAXN];
char ff[MAXN][MAXN], a[MAXN], b[MAXN];

void Change()
{
    int i, j;
    for(i=1; i<MAXN; ++i){
           for(j=len[i]-1; j>=0; --j)  ff[i][len[i]-j-1] = f[i][j]+'0';
           ff[i][len[i]] = '\0';
    }
}

void GetFibonacci()
{
    int i, j, k, len1, len2, t;
    memset(len,0,sizeof(len));
    len[1] = 1;
    len[2] = 1;
    f[1][0] = 1;
    f[2][0] = 1;
    for(i=3; i<MAXN; ++i){
           len[i] = len[i-1] > len[i-2] ? len[i-1] : len[i-2];
           for(j=0; j<MAXN; ++j) f[i][j] = 0;
           t = 0;
           for(j=0; j<len[i]; ++j){
                 f[i][j] = (f[i-1][j]+f[i-2][j]+t)%10;
                 t = (f[i-1][j]+f[i-2][j]+t)/10;
           }
           if(t){
                f[i][len[i]] = t;
                len[i]++;
           }
    }
    Change();
}

int main()
{
    int n, i, j, len1, len2, ans;
    GetFibonacci();
    while(scanf("%s %s",a,b)){
         len1 = strlen(a);
         len2 = strlen(b);
         if(len1==1 && a[0]=='0' && len2 ==1 && b[0]=='0')  break;
         ans = 0;
         for(i=2; i<MAXN; ++i){
                if(len2<len[i] )  break;
                else if(len[i]==len2 && strcmp(ff[i],b)>0) break;
                if(len1<len[i])   ans++;
                else if(len1==len[i] && strcmp(ff[i],a)>=0)  ans++;
         }
          printf("%d\n",ans);
    }
    return 0;
}
posted on 2012-08-04 18:04  Yuna_  阅读(70)  评论(0)    收藏  举报