hiho一下 第157周 二进制小数

来源:互联网 发布:手机编程工具排行榜 编辑:程序博客网 时间:2024/06/01 19:40

题目1 : 二进制小数

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

样例输入
30.50.750.3
样例输出
0.10.11NO

参考:

hiho一下第157周《二进制小数》题目分析

十进制小数转二进制小数我们可以模拟“乘2减1”的手算过程。例如对于0.6875,这个“乘2减1”的过程是这样的,每次将当前小数乘以2,如果结果大于等于1,那么将结果减1:

 0.6875x     2=1.375    减去整数部分    1 0.375x    2=0.75     减去整数部分    0 0.75x   2=1.5      减去整数部分    1 0.5x  2=1.0      减去整数部分    1 0        结束

经过4次“乘2减1”的操作,结果变为0。我们依次减去的整数部分是1011,所以对应的二进制小数就是0.1011。

假设X的小数部分有N位,如果我们经过N次操作结果仍不为0,那么X就不能表示成有限位数的二进制小数。

考虑到X的小数部分可能有100位,我们实现这个模拟手算的过程需要用“高精度”计算的方法:用一个数组去保存每一位数字,然后按位进行乘以2的操作。


https://hihocoder.com/discuss/question/4593

package hihocoder;
import java.util.*;
public class erjinzhixiaoshu {


//二进制小数
public static void main(String[] args) {
// TODO Auto-generated method stub


Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
sc.nextLine();
String ss[]=new String[n];
for(int i=0;i<n;i++){
ss[i]=sc.nextLine();
erjinzhixiaoshu(ss[i]);
}
sc.close();

}

private static void erjinzhixiaoshu(String s){
int y=s.length()-2;
int[] cc=new int[y];
for(int i=2;i<s.length();i++){
cc[i-2]=s.charAt(i)-'0';
}
if(cc[cc.length-1]!=5){
System.out.println("NO");
return;
}
int[] res=new int[y];
for(int i=0;i<y;i++){
int a=0;
for(int j=cc.length-1;j>=0;j--){
int tmp=cc[j]*2+a;
cc[j]=tmp%10;
a=tmp/10;
// System.out.println(cc[j]+" "+a);
}
res[i]=a;
}
if(allzero(cc)){
String ss="0.";
for(int i=0;i<res.length;i++){
ss+=res[i];
}
System.out.println(ss);
}else
System.out.println("NO");
}


private static boolean allzero(int[] nums){
for(int i=0;i<nums.length;i++)
{
if(nums[i]!=0)return false;
}
return true;
}


}

原创粉丝点击