FZU 2036 Log Calculator
思路:数学题!
给定a,b,求s=log2(2a+2b);转化为s=b+log2(2a-b+1),(a>b).
测试可以知道,当x>=32时,在精度范围内log2(2x+1)=x。否则将a-b转化为double类型直接计算。
代码如下:
1 import java.math.*; 2 import java.math.BigDecimal; 3 import java.util.*; 4 public class Main { 5 public static void main(String arg[]){ 6 BigDecimal a,b,c,x,y,z,d,an,ans; 7 Scanner cin=new Scanner(System.in); 8 int t=1,tt; 9 tt=cin.nextInt(); 10 an=BigDecimal.valueOf(32); 11 while(tt-->0){ 12 a=cin.nextBigDecimal(); 13 b=cin.nextBigDecimal(); 14 if(a.compareTo(b)>0){ 15 c=a.subtract(b); 16 d=b; 17 ans=a; 18 }else{ 19 c=b.subtract(a); 20 d=a; 21 ans=b; 22 } 23 if(c.compareTo(an)<0){ 24 double s=c.doubleValue(); 25 s=Math.pow(2.0,s)+1; 26 s=Math.log(s)/Math.log(2.0); 27 ans=d; 28 ans=ans.add(BigDecimal.valueOf(s)); 29 } 30 ans = ans.setScale(9, BigDecimal.ROUND_HALF_UP); 31 System.out.println("Case "+t+": "+ans); 32 t++; 33 } 34 } 35 }