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