TOJ 1345 How Many Fibs? 比较水的一个题目
题意很简单 : 给出俩数,求出这俩数之间有几个斐波那契数:但是需要注意的是:
题目中开始三个位: 1 2 3 ,而不是常用的:1 1 2 3 ,另外考虑到大数,就直接java 了; fibs[500]就已经超过了100位:
代码:
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args)
{
try{
BigInteger[] fib = new BigInteger[500];
fib[1]=new BigInteger("1");fib[2]=new BigInteger("2");
for(int i=3;i<500;i++)
{
fib[i]=fib[i-1].add(fib[i-2]);
}
String a,b;
Scanner in = new Scanner(System.in);
while(in.hasNext())
{
a=in.next();
b=in.next();
BigInteger f1=new BigInteger(a);
BigInteger f2 =new BigInteger(b);
if(f1.compareTo(new BigInteger("0"))==0&&f2.compareTo(new BigInteger("0"))==0)break;
int left=0,right=0;
boolean flag=false;
for( int i=1;i<500;i++)
{
BigInteger t1=fib[i].subtract(f1);
BigInteger s1=fib[i+1].subtract(f1);
BigInteger t2=fib[i].subtract(f2);
BigInteger s2=fib[i+1].subtract(f2);
if(!flag&&t1.signum()==1)left=1;
if(t1.signum()==-1&&s1.signum()==1) {left=i+1;flag=true;}// 找到大于等于左边的数的最小下标
if(t1.signum()==0) {left=i;flag=true;}
if((t2.signum()==-1&&s2.signum()==1)||t2.signum()==0){right=i;break;}//找出小于等于右边数的最大小标
}
System.out.println(right-left+1);
}
}
catch(Exception e){}
}
}