poj 3431 Java实现

来源:互联网 发布:单片机中断初始化程序 编辑:程序博客网 时间:2024/06/07 12:11
poj 3431 Java实现
import java.util.Scanner;public class Main3413 {//poj3413static 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);}}}
原创粉丝点击