zoj 1962 How Many Fibs

//不够精简,效率也不高,以后学了傅里叶变换再做吧。。。 
#define LOCAL
#include<iostream>
#include<cstring>
#define N 1001
using namespace std;
int cmp(int a[N],string s)
{
       char t;
       string b=s;
       int i,la,lb=b.size();
       for(i=0;i<lb/2;i++)
       {
              t=b[i];
              b[i]=b[lb-i-1];
              b[lb-i-1]=t;            
       }
       lb--;
       la=N-1;
       while(!a[la]) la--;
       if(la>lb)
          return 1;
       else if(la<lb)
          return -1;
       else
       {
            if(a[la]==(b[la]-'0')) //这里的判断也出了错误。。。 
            {
                   i=la;
                   while(a[i]==(b[i]-'0')&&i>=0) i--;
                   if(i<0)
                         return 0;
                   else if(a[i]>(b[i]-'0'))
                           return 1;
                   else return -1;                    
            }
            else if(a[la]>(b[la]-'0'))
                return 1;
            else return -1;     
       }
          
}
int main()
{
#ifdef LOCAL
       freopen("input.txt","r",stdin);
       freopen("output.txt","w",stdout);
#endif
    int sum[N],a[N],b[N],n,i,t,count;
    string x,y;
    while(cin>>x>>y)
    {
        if(x=="0"&&y=="0")
              return 0;
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        memset(sum,0,sizeof(sum));
        b[0]=1;
        count=0;
        while(1)
        {
           for(i=0;i<N;i++)
              sum[i]=a[i]+b[i];
           for(i=0;i<N;i++)
           {
              t=sum[i]/10;
              sum[i]=sum[i]%10;
              sum[i+1]+=t;                
            }   
            if(cmp(sum,x)>=0&&cmp(sum,y)<=0)   //cmp()一直出错,哎。。。 
                 count++;
            else if(cmp(sum,y)>0)   //这的条件弄错了,纠结了好半天。。。 
                 break;
            memcpy(a,b,sizeof(int)*N);
            memcpy(b,sum,sizeof(int)*N);            
        }
        cout<<count<<endl;
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值