HDU-5973 Game of Taking Stones(大数+二分求精度)

题意:

单纯的威佐夫博弈,不过数据范围增加到10^100,所以要用Java大数,所以当数一大,黄金分割数(1+√5)/2.0的精度就很重要了,而黄金分割数的精度又在于√5的精度,所以需要用到二分法求√5到一定精度。


import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Scanner;


public class Main {
	public static void main(String args[]){
		String s = "0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001";
		BigDecimal eps = new BigDecimal(s);
		BigDecimal F = BigDecimal.valueOf(5);
		BigDecimal l = BigDecimal.valueOf(2), r = BigDecimal.valueOf(3), mid;
		while(l.multiply(l).subtract(F).abs().compareTo(eps) > 0){
			mid = l.add(r).divide(BigDecimal.valueOf(2));
			if(mid.multiply(mid).compareTo(F) < 0) l = mid;
			else r = mid;
		}
		BigDecimal key = l.add(BigDecimal.ONE).divide(BigDecimal.valueOf(2.0));
		
		Scanner in = new Scanner(System.in);
		while(in.hasNext()){
			BigDecimal x, y;
			x = in.nextBigDecimal();
			y = in.nextBigDecimal();
			if(x.compareTo(y) > 0){
				BigDecimal t = x;
				x = y;
				y = t;
			}
			String s1 = y.subtract(x).multiply(key).toString();
			for(int i = 0; i < s1.length(); ++i)
				if(s1.charAt(i) == '.'){
					s1 = s1.substring(0, i);
					break;
				}
			BigInteger bt1 = new BigInteger(s1);
			BigInteger bt2 = x.toBigInteger();
			if(bt1.compareTo(bt2) == 0) System.out.println(0);
			else System.out.println(1);
		}
	}
}

继续加油~

你可能感兴趣的:(各种博弈,HDU)