hihoCoder 二进制小数 BigDecimal使用

来源:互联网 发布:哈萨克歌曲软件baigie 编辑:程序博客网 时间:2024/05/23 21:17

二进制小数

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

给定一个十进制小数X,判断X的二进制表示是否是有限确定的。

例如0.5的二进制表示是0.1,0.75的二进制表示是0.11,0.3没有确定有限的二进制表示。

输入

第一行包含一个整数 T (1 ≤ T ≤ 10),表示测试数据的组数。

以下T行每行包含一个十进制小数 X (0 < X < 1)。 X一定是以"0."开头,小数部分不超过100位。

输出

对于每组输入,输出 X 的二进制表示或者NO(如果 X 没有确定有限的二进制表示)。

样例输入
30.50.750.3
样例输出
0.10.11NO
要清楚,小数的从十进制转二进制不是取余而是乘法。
import java.math.BigDecimal;import java.util.Scanner;public class Main {public static void main(String args[]){Main test=new Main();test.start();}public void start(){Scanner scan=new Scanner(System.in);int num=scan.nextInt();for(int i=0;i<num;i++){calculate(new BigDecimal(scan.next()),0);if(result.equals("NO")){System.out.println(result);}elseSystem.out.println("0."+result.substring(1));result="";}}String result="";public void calculate(BigDecimal a,int a1){if(a1>5000){result="NO";return;}if(a.compareTo(BigDecimal.ZERO)==0){return;}if(a.compareTo(BigDecimal.ONE)>=0){a=a.subtract(BigDecimal.ONE);result+=1;}else{result+=0;}calculate(a.multiply(BigDecimal.valueOf(2)),++a1);}}

总结:对于BigDecimal没有toString(int)这个方法,得注意一下以后就得自己转二进制了。
记录一下方法。
 BigDecimalstripTrailingZeros()
          返回数值上等于此小数,但从该表示形式移除所有尾部零的 BigDecimal StringtoPlainString()
          返回不带指数字段的此 BigDecimal 的字符串表示形式。BigDecimal(BigInteger unscaledVal, int scale, MathContext mc)
          将 BigInteger 非标度值和 int 标度转换为 BigDecimal(根据上下文设置进行舍入)。
ROUND_HALF_DOWN
          向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为上舍入的舍入模式。
doubledoubleValue()
          将此 BigDecimal 转换为 double