hihoCoder 二进制小数 BigDecimal类

本文介绍了一个算法,用于判断一个十进制小数能否转换为有限长度的二进制数,并提供了一个使用Java BigDecimal实现的具体示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目地址: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类 的参数来指定精度和舍入方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值