Problem:
博士が愛した２進数

「君の靴のサイズはいくつかね」

初対面の私に、いきなり博士は尋ねました。

「 23.5 です」

「ほお、実にきりのいい数字だ。2 の 4 乗に 2 の 2 乗と 2 の 1 乗と 2 の 0 乗と 2 の -1 乗を 加えた数だ」

続けて博士は尋ねました。

「君、身長はいくつかね」

「はい、158.1 です」

博士は腕組みをして目を閉じました。しばらくの沈黙の後、口を開きました。

「ナァ~」

その後一緒に過ごした時間の中で、博士の行動がだんだん理解できるようになりました。

まず、 私が博士の求めに応じて実数を言います。実数が整数部 8 桁以内で小数部 4 桁以内の 2 進数で表される場合、博士は 2 進数への変換結果を満足げに語ります。そうでない場合、悲しげに「ナァ~」 と鳴きます。これは、私が負の実数を言うまで繰り返されるのです。

さて、博士は年齢とともにだんだんに長い計算が難しくなってきました。そこで、みなさんが博士に代わって、実数を入力し 2 進数に変換・出力するプログラムを作ってあげてください。ただし、2 進表現が制限桁数 (整数部 8 桁以内 + 小数部 4 桁以内) に収まらない場合は、NA (半角英字) を出力してください。入力される実数は整数部 8 桁以内、小数部 4 桁以内に収まるものとし、出力する 2 進表現は整数部 8 桁、小数部 4 桁で出力してください。

Input

複数のデータセットの並びが入力として与えられます。入力の終わりは負の実数ひとつの行で示されます。
各データセットとして１つの実数 n が１行に与えられます。

データセットの数は 1200 を超えません。

Output

入力データセットごとに 2 進数への変換結果を出力します。

Sample Input

23.5
158.1
-1.0

Output for the Sample Input

00010111.1000
NA

Solution in JAVA (judge verdict: Accepted)

import java.util.*;
public class Main{
    public static void main(String[] args){
	new Main().run();
    }
    Scanner sc = new Scanner(System.in);

    double n;
    boolean[] bitsI; // 8テヲツ閉エテヲツ閉ー
    boolean[] bitsD; // 4テ・ツーツ湘ヲツ閉ー
    boolean NA;
    int a;
    double b;

    void run(){
	while(sc.hasNext()){
	    n = sc.nextDouble();
	    if(n<0) break;
	    bitsI = new boolean[8];
	    bitsD = new boolean[4];
	    NA = false;

	    a = (int)n/1;
	    b = n - a;

	    NA = getBitD() || getBitI();


	    if(NA) System.out.println("NA");
	    else show();
	}
    }

    boolean getBitI(){
	if(a>255) return true;
	int c = 128;
	for(int i=0; i<bitsI.length; i++){
	    if(a>=c){
		bitsI[i] = true;
		a -= c;
	    }
	    c /= 2;
	}
	if(a==0) return false;
	return true;
    }

    boolean getBitD(){
	double c = 0.5;
	for(int i=0; i<bitsD.length; i++){
	    if(b>=c){
		bitsD[i] = true;
		b -= c;
	    }
	    c /= 2;
	}
	if(b==0.0) return false;
	return true;
    }
		
    void show(){
	for(int i=0; i<bitsI.length; i++)
	    System.out.print(bitsI[i] ? "1" : "0");
	System.out.print(".");
	for(int i=0; i<bitsD.length; i++)
	    System.out.print(bitsD[i] ? "1" : "0");
	System.out.println();
    }
}