您的位置:首页 > 其它

zoj 1962 || poj 2413 How many Fibs?

2012-04-08 22:11 423 查看
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
int f[500][110];
int x;
int len[500],nn,bb;
int find(int s[],int n)
{

for(int i=1;i<500;i++)
{
if(len[i]<n)
continue;
if(len[i]==n)
{
int flag=0;
for(int k=n-1;k>=0;k--)
{
if(f[i][k]>s[k])
return i;
else if(f[i][k]==s[k])
continue;
else { flag=1;break;}
}
if(flag==0)
{
x++;
return i;
}
}
if(len[i]>n)
return i;
}
return 0;
}
int main()
{
char s1[110],s2[110];
int low[110],high[110];
memset(f,0,sizeof(f));
memset(len,0,sizeof(len));
f[1][0]=1;
f[2][0]=2;
len[1]=len[2]=1;
for(int i=3;i<500;i++)
{
memcpy(f[i],f[i-1],sizeof(f[i-1]));
int l=len[i-1]>len[i-2]?len[i-1]:len[i-2];
for(int k=0;k<l;k++)
{
f[i][k]+=f[i-2][k];
if(f[i][k]>9)
{
f[i][k+1]++;
f[i][k]%=10;
}
if(f[i][l]==0)
len[i]=l;
else len[i]=l+1;
}
}
while(scanf("%s %s",s1,s2)!=EOF&&(s1[0]!='0'||s2[0]!='0'))
{
int len1=strlen(s1);
int len2=strlen(s2);
int i;
x=0;
for(i=len1-1;i>=0;i--)
low[len1-1-i]=s1[i]-'0';
for(i=len2-1;i>=0;i--)
high[len2-i-1]=s2[i]-'0';
int a=find(low ,len1);
int nn=x;
x=0;
int b=find(high,len2);
bb=x;
if(nn==1&&bb==1)
{	cout<<b-a+1<<endl;
continue;
}
if(nn==1&&bb==0)
cout<<b-a<<endl;
else{
if(nn==0&&bb==1)
cout<<b-a+1<<endl;
else cout<<b-a<<endl;
}
}
return 0;
}


转载声明:http://blog.csdn.net/zxy_snow/article/details/6068592
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  include