Java高精度题:
给定a,b,求s=log2(2a+2b);
解析:
a>ba=log2(x) x=2^a
b=log2(y) y=2^b
log2(x+y) = b+log2(1+2^(a-b));
在a-b > 32时,log2(1+2^(a-b)) 近似等于 log2(2^(a-b))
总结:之前对于Java的高精度不太熟练,通过这题加强了Java高精度的练习,
还有本来这题还是可以做出来的,因为没有听方敏霞同学,话没完成这题,留此句以警示自己。
import java.util.Scanner;
import java.math.*;
public class Main {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int t , cas = 1;
BigDecimal a,b,sum,beta;
t = cin.nextInt();
while(t-- != 0) {
a = cin.nextBigDecimal();
b = cin.nextBigDecimal();
if(a.compareTo(b) > 0) {
BigDecimal tmp = a;
a = b;
b = tmp;
}
beta = a.subtract(b);
if(beta.compareTo(BigDecimal.valueOf(32)) > 0) {
sum = b.add(beta);
}else {
double x = beta.doubleValue();
double cnt = Math.pow(2.0, x) + 1;
double s = Math.log(cnt) / Math.log(2.0);
sum = b.add(BigDecimal.valueOf(s));
}
sum = sum.setScale(9, BigDecimal.ROUND_HALF_UP);
System.out.println("Case " + (cas++) + ": "+sum);
}
}
}