AOJ0268 Kongo Type
問題リンク Kongo Type
- 解法
入力値を16進数の1つの整数としてみて、ビットマスクを使って解きました。
(0.5)^n の浮動小数点は誤差なく正確に計算できるので、色々と心配しなくて大丈夫です。
余談
入力値が32ビットなので、楽をするためにInteger.parseInt(sc.next(), 16)を使おうと思ったら例外吐かれて死にました。"0x80000000"は2^31なのですが、Integer.MAX_VALUEを超えるのでint型に収まらないと解釈されるみたいです。Long.parseIntを使えば問題ないです。
- ソース
import java.util.Scanner; //Kongo Type public class AOJ0268 { void run(){ Scanner sc = new Scanner(System.in); int n = sc.nextInt(); while(n--!=0){ long X = Long.parseLong(sc.next(), 16); long a = (X&0x7fffff80)>>7; double b = 0, dt = 0.5; long f = X&0x7f; long pos = 1L<<6; while(0 < pos){ if((f&pos)>0){ b+=dt; } pos >>= 1; dt/=2; } String t = (b+"").substring(2); System.out.printf("%s%d.%s\n", ((X&0x80000000)>0)?"-":"", a, t); } } public static void main(String[] args) { new AOJ0268().run(); } }