http://acm.hdu.edu.cn/showproblem.php?pid=1316
被老师坑了,做这个题,题目不难但是调试的蛋疼死我了,用程序跑了下,发现10^100以为的fib数最多480+,然后就开始打表暴力了
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
char s1[500][110];
int len[500];
void add(char *s1,char *s2,char *tmp,int &n)
{
int ret=0;
for(int i=0;i<n;i++)
{
ret+=s1[i]-'0'+s2[i]-'0';
tmp[i]=ret%10+'0';
ret/=10;
}
if(ret!=0) tmp[n++]=ret+'0';
}
char a[110],b[110];
int cmp(char *s1,char *s2,int n)
{
for(int i=n-1;i>=0;i--)
{
if(s1[i]>s2[i]) return 1;
else if(s1[i]<s2[i]) return -1;
}
return 0;
}
void reverse(char *s,int len)
{
char tmp[110];
for(int i=0;i<len;i++)
tmp[i]=s[len-1-i];
memcpy(s,tmp,sizeof(tmp));
}
int main()
{
for(int i=0;i<500;i++)
for(int j=0;j<110;j++)
s1[i][j]='0';
s1[0][0]='1';
s1[1][0]='2';
len[0]=len[1]=1;
int n=1,pre=2;
while(n<102)
{
add(s1[pre-2],s1[pre-1],s1[pre],n);
len[pre]=n;
pre++;
}
while(scanf("%s %s",a,&b)==2)
{
int len1=strlen(a);
int len2=strlen(b);
if(len1==1&&len2==1&&a[0]=='0'&&b[0]=='0') break;
int l=0;
reverse(a,len1);
reverse(b,len2);
while(1)
{
if(len[l]>len1||(len[l]==len1&&cmp(s1[l],a,len1)>=0)) break;
l++;
}
int r=1;
while(r)
{
if(len[r]>len2||(len[r]==len2&&cmp(s1[r],b,len2)>0)) break;
r++;
}
printf("%d\n",r-l);
}
return 0;
}
java 的BigInteger还是比较方便的
import java.math.*;
import java.util.*;
public class Main{
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner cin = new Scanner( System.in );
// System.out.println("song");
BigInteger a1,a2,f1,f2;
while(cin.hasNext())
{
a1=cin.nextBigInteger();
a2=cin.nextBigInteger();
f1=BigInteger.valueOf(1);
f2=BigInteger.valueOf(2);
if(a1.equals(BigInteger.ZERO)&&a2.equals(BigInteger.ZERO))break;
int cnt=0;
if(f1.compareTo(a1)>=0&&f1.compareTo(a2)<=0) cnt++;
//System.out.println(cnt);
while(true)
{
if(f2.compareTo(a1)>=0&&f2.compareTo(a2)<=0) cnt++;
if(f2.compareTo(a2) >0 ) break;
BigInteger tmp=f1.add(f2);
f1=f2;
f2=tmp;
//System.out.println(f1+" "+f2);
}
System.out.println(cnt);
}
}
}