POJ 2413  How many Fibs?

来源:互联网 发布:天涯明月刀巅峰数据 编辑:程序博客网 时间:2024/05/16 15:46
How manyFibs?
Time Limit: 1000MSMemory Limit: 65536KTotal Submissions: 8617Accepted: 3173

Description

Recall thedefinition of the Fibonacci numbers:
f1 := 1 
f2 := 2
fn := fn-1 + fn-2 (n>=3)

Given two numbers a and b, calculate how many Fibonacci numbers arein the range [a,b].

Input

The inputcontains several test cases. Each test case consists of twonon-negative integer numbers a and b. Input is terminated by a=b=0.Otherwise, a<=b<=10100.The numbers a and b are given with no superfluous leadingzeros.

Output

For eachtest case output on a single line the number of Fibonacci numbersfi with a<=fi<=b.

Sample Input

10 1001234567890 98765432100 0

Sample Output

54

Source

Ulm Local 2000
事情就是这么的气人,在第一次做的时候本来想到方法了,可是自己又没有编出来,结果在下面做的时候竟然一次就AC了(CE的那个不说,是忘记北大OJ上不认识strrev函数了)。POJ <wbr>2413 <wbr> <wbr>How <wbr>many <wbr>Fibs?
这题就是大整数加法,把一百位以内的所有数求出来(事实证明一百位以内的斐波那契数列并没有多少,这个想想就知道),然后通过与a和b的比较得出最后的结果
代码如下:
C语言: 高亮代码由发芽网提供
#include<stdio.h>
#include<string.h>
#define N 102
charstr[10005][102];
voidStrrev(char str[])
{
inti,j=0;
chars[1009];
for(i=strlen(str)-1;i>=0;i--)
s[j++]=str[i];
s[j]='\0';
strcpy(str,s);
}
intadd(char str_a[],char str_b[],char str_c[])
{
chara[N],b[N],c[N];
inti,sum,len_a,len_b,len,carry;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
strcpy(a,str_a);strcpy(b,str_b);
Strrev(a);Strrev(b);
len_a=strlen(a);len_b=strlen(b);
for(i=0;i<len_a;i++)
a[i]=a[i]-'0';
for(i=0;i<len_b;i++)
b[i]=b[i]-'0';
len=len_a>len_b?len_a:len_b;
carry=0;
for(i=0;i<len;i++)
{
sum=a[i]+b[i]+carry;
c[i]=sum%10;
carry=sum/10;
}
if(carry==1)
{
c[i]=carry;
i++;
}
len=i;
for(i=0;i<len;i++)
c[i]=c[i]+'0';
c[len]='\0';
Strrev(c);
strcpy(str_c,c);
returnlen;
}
intcompare(char a[],char b[])
{
intlen_a,len_b;
len_a=strlen(a);
len_b=strlen(b);
if(len_a>len_b)
return1;
elseif(len_a<len_b)
return-1;
else
{
returnstrcmp(a,b);
}
}
intmain()
{
inti,j,count;
chara[102],b[102];
strcpy(str[1],"1");
strcpy(str[2],"2");
for(i=3;;i++)
{
j=add(str[i-1],str[i-2],str[i]);
if(j>100)break;
}
j=i;
while(scanf("%s%s",a,b),strcmp(a,"0")!=0||strcmp(b,"0")!=0)
{
count=0;
for(i=1;i<j;i++)
{
if(compare(a,str[i])<=0)
{
if(compare(b,str[i])>=0)
count++;
elsebreak;
}
}
printf("%d\n",count);
}
return0;
}

这题数据应该不是太强,就不附数据了。
原创粉丝点击