hihoCoder 二进制小数 BigDecimal类

来源:互联网 发布:淘宝开店需要的csv 编辑:程序博客网 时间:2024/06/05 14:23

题目地址:http://hihocoder.com/contest/hiho157/problem/1

时间限制: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 没有确定有限的二进制表示)。

样例输入

3
0.5
0.75
0.3

样例输出

0.1
0.11
NO

Java 代码如下:

import java.math.BigDecimal;import java.util.Scanner;public class Main {    public static void main(String[] args) {        // TODO Auto-generated method stub        Scanner in=new Scanner(System.in);        BigDecimal one=new BigDecimal("1");        int t;        t=in.nextInt();        for(int i=0;i<t;i++){            BigDecimal bd=new BigDecimal(in.next());            String s=bd.toString();            String bina="0.";            int flag=0;            for(int j=1;j<=s.length()-2;j++){                bd=bd.add(bd);         //乘2                switch (bd.compareTo(one)) {                case 1: //大于1                    bd=bd.add(one.negate()); //-1                    bina+="1";                    break;                case 0://等于1,返回                    bd=bd.add(one.negate());                    bina+="1";                    flag=1;                    break;                case -1://小于1                    bina+="0";                    break;                }                if(flag==1){                    break;                }            }            if(bd.compareTo(new BigDecimal("0"))==0){                System.out.println(bina);            }            else{                System.out.println("NO");            }        }    }}

思路:用Java 的BigDecimal类存数,模拟笔算过程 : 不断乘2,如果大于1,二进制数后面就添“1”再减1,否则添“0”。对于n位的小数,如果乘了n次2,结果还不是1,那就不能用确定有限的二进制数表示。

顺便总结一下常用BigDecimal类的函数:

a.negate() -a,求相反数,返回值是BigDecimal类

a.abs() ,求a绝对值,返回值是BigDecimal类

a.compareTo(BigDecimal b), a与b比较,若相等返回0,a > bd返回1,a < b 返回-1.

a.add(BigDecimal b) ,a+b,参数和返回值都是BigDecimal类

a.subtract(BigDecimal b) ,a-b,参数和返回值都是BigDecimal类

a.multiply(BigDecimal b) ,a*b,参数和返回值都是BigDecimal类

a.divide(BigDecimal b) a/b 返回值是BigDecimal类

movePointLeft(n) ,小数点左移n位,,返回值是BigDecimal类

movePointRight(n) ,小数点右移n位,,返回值是BigDecimal类

byteValue()
doubleValue()
longValue() ,截取返回相应类型的数。

toString() ,转换成字符串

其中大多数函数都可以添加MathContent类 的参数来指定精度和舍入方式。

原创粉丝点击