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.math.BigDecimal;
import java.util.Scanner;
class Main {
	public static void main(String[] args){
		double num;
		Scanner sc = new Scanner(System.in);
		Doctor d;
		
		while(true){
			num = sc.nextDouble();
			if(num < 0){
				break;
			}
			d = new Doctor(num);
			if(d.judge()){
				System.out.println(d.getBD());
			}else{
				System.out.println("NA");
			}
		}
	}
}

class Doctor {
	double num;
	String bd;
	int integers;
	double decimals;
	
	Doctor(double num){
		this.num = num;
		bd = "";
		integers = (int)num;
		decimals = new BigDecimal(num - integers).setScale(4, BigDecimal.ROUND_UP).doubleValue();
	}
	
	public boolean judge(){
		if(integers>255 || decimals>0.9375){
			return false;
		}
		return true;
	}
	
	private boolean toBinaryDigits(){
		String tmp = "";
		int count = 1;
		
		for(int i=integers;i>0;i/=2){
			tmp += i%2;
		}
		StringBuffer sb = new StringBuffer(tmp);
		for(int i=0;i<8-tmp.length();i++){
			bd += "0";
		}
		bd += sb.reverse().toString()+".";
		while(true){
			if(decimals == 0){
				bd += "0000";
				break;
			}
			
			if(count > 4){
				return false;
			}
			decimals *= 2;
			if(decimals >= 1){
				decimals -=1;
				bd += "1";
				if(decimals == 0){
					for(int i=0;i<4-count;i++){
						bd += "0";
					}
					break;
				}
			}else{
				bd += "0";
			}
			count++;
		}
		
		return true;
	}
	
	public String getBD(){
		if(toBinaryDigits()){
			return bd;
		}
		return "NA";
	}
}