题目1 : 二进制小数
https://hihocoder.com/contest/hiho157/problem/1
时间限制:
10000ms
单点时限:
1000ms
内存限制:
256MB
-
3 0.5 0.75 0.3
样例输出
-
0.1 0.11 NO
-
参考:
hiho一下第157周《二进制小数》题目分析
十进制小数转二进制小数我们可以模拟“乘2减1”的手算过程。例如对于0.6875,这个“乘2减1”的过程是这样的,每次将当前小数乘以2,如果结果大于等于1,那么将结果减1:0.6875 x 2 =1.375 减去整数部分 1 0.375 x 2 =0.75 减去整数部分 0 0.75 x 2 =1.5 减去整数部分 1 0.5 x 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;
}
}
-
描述
给定一个十进制小数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 没有确定有限的二进制表示)。