poj 3431 Java实现
import java.util.Scanner;
public class Main3413 {
//poj3413
static int[][] fibarray = new int[502][106];
static int[] bigInterAdd(int[] a, int[] b) {
int[] temRes = new int[a.length];
if (a[0] == 0) {
return b;
} else if (b[0] == 0) {
return a;
}
for (int i = 1; i < a.length; i++) {
temRes[i] += a[i] + b[i];
if (temRes[i] > 9) {
temRes[i] = temRes[i] % 10;
temRes[i + 1]++;
}
}
return temRes;
}
static int[] fib(int n) {
if (n == 1) {
fibarray[1][1] = 1;
fibarray[1][0] = 1;
return fibarray[1];
}
if (n == 2) {
fibarray[2][1] = 2;
fibarray[2][0] = 1;
return fibarray[2];
}
if (fibarray[n][0] == 0) {
fibarray[n] = bigInterAdd(fib(n - 1), fib(n - 2));
fibarray[n][0] = 1;
}
return fibarray[n];
}
static int binaFindLeft(int[] a, int left, int right) {
int mid = (left + right) / 2;
int compRes = compTo(a, fib(mid));
if (compRes == 0) {
return mid;
}
if (mid == left) {
return right;
}
if (compRes == -1) {
return binaFindLeft(a, left, mid);
} else {
return binaFindLeft(a, mid, right);
}
}
static int binaFindRight(int[] a, int left, int right) {
int mid = (left + right) / 2;
int compRes = compTo(a, fib(mid));
if (compRes == 0) {
return mid;
}
if (mid == left) {
return mid;
}
if (compRes == -1) {
return binaFindRight(a, left, mid);
} else {
return binaFindRight(a, mid, right);
}
}
static int compTo(int[] a, int[] b) {
for (int i = a.length - 1; i > 0; i--) {
if (a[i] > b[i]) {
return 1;
}
if (a[i] < b[i]) {
return -1;
}
}
return 0;
}
public static void main(String[] args) throws Exception {
System.setIn(new java.io.FileInputStream("1.txt"));
Scanner in = new Scanner(System.in);
fib(501);
while (true) {
String begain, end;
begain = in.next();
end = in.next();
int[] s = new int[106];
int[] zero = new int[106];
for (int i = 1; i <= begain.length(); i++) {
s[i] = begain.charAt(begain.length() - i) - '0';
}
int[] e = new int[106];
for (int i = 1; i <= end.length(); i++) {
e[i] = end.charAt(end.length() - i) - '0';
}
int sIsZero,eIsZero;
sIsZero=compTo(s, zero);
eIsZero=compTo(e, zero) ;
if ( sIsZero== 0 && eIsZero== 0) {
break;
}
int firstnum, endnum;
if (sIsZero==0) {
firstnum=1;
}else {
firstnum = binaFindLeft(s, 1, 501);
}
endnum = binaFindRight(e, 1, 501);
int totalnum = 0;
if (endnum >= firstnum) {
totalnum = endnum - firstnum + 1;
}
System.out.println(totalnum);
}
}
}