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();
	}
}