题意:
fib[1]=1,fib[2]=2,fib[n]=fib[n-1]+fib[n-2]。给一个区间[a,b],其中a<=b<=10^100,求出在些区间的Fibonacci数有多少个。测试示例有多个,当a与b都输入0时结束。
示例输入:
10 100
1234567890 9876543210
0 0
示例输出:
5
4
解决方案:
用equals()函数,a.equals(b),如果a==b,返回true;a!=b,返回false。附:java 1.7 APIs
1、为了节省内存空间,先求出第一个大于10^100的Fib数,结果为480。所以数组最大只要开480。
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n;
BigInteger []arr = new BigInteger[1000];
BigInteger t = new BigInteger("10").pow(100);
arr[0] = new BigInteger("1");
arr[1] = new BigInteger("2");
int i=2;
while(arr[i-1].compareTo(t)<0){
arr[i]=arr[i-1].add(arr[i-2]);
i++;
}
System.out.println(i+"\n"+arr[i-1]+"\n"+t);
}
}
运行输出:
480
14913169640232740127827512057302148063648650711209401966150219926546779697987984279570098768737999681
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
2、循环结束条件:依次进行比较,当arr[i]>b时,说明已超出区间,结束循环。如果a<=arr[i]<=b,统计Fibs数个数的变量cnt加1。
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
//声明部分
Scanner input = new Scanner(System.in);
int i,cnt;
BigInteger []arr = new BigInteger[480];
BigInteger a,b;
//预处理
arr[0] = new BigInteger("1");
arr[1] = new BigInteger("2");
for( i = 2 ;i<480;i++)
arr[i]=arr[i-1].add(arr[i-2]);
//主体部分
while(true){
a=input.nextBigInteger();
b=input.nextBigInteger();
if(a.equals(BigInteger.ZERO)&&b.equals(BigInteger.ZERO)) break;
i=0;
cnt=0;
while(arr[i].compareTo(b)<=0) {
if(arr[i].compareTo(a)>=0) cnt++;
i++;
}
System.out.println(cnt);
}
}
}