给定一个double num,范围是0到1的实数,若其能用32位以内的二进制表示出来则返回值string为其二进制值,若不能则返回值为“Error”。
测试样例:
0.625
返回:0.101
class BinDecimal {
public:
string printBin(double num) {
string str("0.");
double base = 0.5;
while(num > 0){
if(num >= base){
num -= base;
str += "1";
}//if
else{
str += "0";
}//else
base /= 2;
if(str.size() > 32){
str = "Error";
break;
}//if
}//while
return str;
}
};
整数部分:除以2,取出余数,商继续除以2,直到得到0为止,将取出的余数逆序
小数部分:乘以2,然后取出整数部分,将剩下的小数部分继续乘以2,然后再取整数部分,一直取到小数部分为零为止。如果永远不为零,则按要求保留足够位数的小数,最后一位做0舍1入。将取出的整数顺序排列。
举例:22.8125 转二进制的计算过程:
整数部分:除以2,商继续除以2,得到0为止,将余数逆序排列。
22 / 2 11 余0
11/2 5 余 1
5 /2 2 余 1
2 /2 1 余 0
1 /2 0 余 1
得到22的二进制是10110
小数部分:乘以2,取整,小数部分继续乘以2,取整,得到小数部分0为止,将整数顺序排列。
0.8125x2=1.625 取整1,小数部分是0.625
0.625x2=1.25 取整1,小数部分是0.25
0.25x2=0.5 取整0,小数部分是0.5
0.5x2=1.0 取整1,小数部分是0,
得到0.8125的二进制是0.1101
结果:十进制22.8125等于二进制00010110.1101
class BinDecimal {
public:
string printBin(double num) {
stringstream res;
res << "0.";
for (int i=0; i<32; ++i) {
if (num == 0.0) break;
num *= 2;
res << (int)num;
num -= (int)num;
}
if (num == 0.0) {
return res.str();
} else {
return "Error";
}
}
};
运行时间:4ms
占用内存:472k
import java.util.*;
public class BinDecimal {
public String printBin(double num) {
// write code here
if(num>=1 || num<0)
return "Error";
StringBuilder str=new StringBuilder();
str.append("0.");
while(num>0){
if(str.length()>32)
return "Error";
num=num*2;
if(num>=1){
str.append("1");
num-=1;
}else{
str.append(0);
}
}
return str.toString();
}
}
//the Java version
import java.util.*;
public class BinDecimal {
public String printBin(double num) {
StringBuffer sb = new StringBuffer("0.");
while(num != 0.0){
if(sb.length() > 32) return "Error";
num *= 2;
if(num >= 1){
sb.append("1");
num -= 1;
}else{
sb.append("0");
}
}
return sb.toString();
}
}
public String printBin(double num){
StringBuilder sb = new StringBuilder();
sb.append("0.");
int time = 30;
double tmp = num;
while(tmp > 0 && time-- > 0){
tmp *= 2;
sb.append((int)tmp);
tmp = tmp >=1 ? (tmp - 1) : tmp;
}
if(tmp > 0)
return "Error";
else
return sb.toString();
}
class BinDecimal {
public:
string printBin(double num) {
string ans="0.";
double range=0.5;
while(num>0)
{
if(num>=range)
{
num=num-range;
range/=2;
ans+='1';
}
else{
range/=2;
ans+='0';
}
if(ans.size()>32) break;
}
if(num!=0) return "Error";
else return ans;
}
};
import java.util.*;
public class BinDecimal {
public String printBin(double num) {
StringBuffer sr=new StringBuffer();
sr.append(0);
sr.append(".");
while(num!=0){
num=(num*2);
int b=(int)num;
sr.append(b);
num=num-b;
}
if(sr.length()>32)
return "Error";
else
return sr.toString();
}
}
//小数点后第一位是1/2 //之后每后一一位就除以二 //小数点后从前向后开始,每一位上如果大于该位数为“1”所表示的数,
//则该位为“1”,并将数据减少该位为“1”时代表的那个数
//一直这样做,直到减为0,或者超过32位为止
//注意 float ,double类型不能用 ==来判断
class BinDecimal {
public:
string printBin(double num) {
string res = "0.";
double alf = 2;
int count = 1;
while(num > 0 && count <= 32){
if(num - 1/alf > 0){
res.push_back('1');
num = num - 1/alf;
alf = alf*2;
count++;
}
else if(num - 1/alf < 0){
res.push_back('0');
alf = alf*2;
count++;
}
else {
res.push_back('1');
break;
}
}
if(count > 32 ) return "Error";
return res;
}
};
# -*- coding:utf-8 -*-
class BinDecimal:
def printBin(self, num):
if num >= 1 or num <= 0:
return "Error"
binary = ['0', '.']
while num > 0:
if len(binary) >= 32:
return "Error"
r = num * 2
if r >= 1:
binary.append('1')
num = r - 1
else:
binary.append('0')
num = r
return ''.join(binary)
public String printBin(double num) {
if (num < 0 || num > 1)
return "Error";
StringBuilder sb = new StringBuilder().append("0.");
for (int i = 2; i < 32; i++) {
num *= 2;
if (num > 1) {
num -= 1;
sb.append('1');
} else if (num < 1) {
sb.append('0');
} else {
sb.append('1');
return sb.toString();
}
}
return "Error";
}
/*0-1之间小数的二进制表示是通过乘法得到,每次乘以2,注意判断是否可用32位完整表示*/
public String printBin(double num) {
// write code here
String res = doubleToBinary(num);
if(res.length()>32){
return "Error";
}else{
return "0."+res;
}
}
private static String doubleToBinary(double num) {
// TODO Auto-generated method stub
String res = "";
if(num == 0.0){
return 0+"";
}
if(num*2 > 1){
res = "1" + doubleToBinary(num*2-1);
}else if(num*2 == 1.0){
return "1";
}else{// num*2 <1
res = "0" + doubleToBinary(num*2);
}
return res;
}
import java.util.*;
public class BinDecimal {
public String printBin(double num) {
StringBuffer sb = new StringBuffer("0.");
int count = 0;
while( num > Math.pow(10, -7)){
int a = (int)(num * 2);
num = 2*num - a;
sb.append(a);
count++;
if(count > 23)//32位浮点数表示小数位只有23位,因为是0到1之间的数,只能是占据小数位
return "Error";
}
return sb.toString();
}
}
public static String printBin(double num) {
// write code here
int i = 2;
char[] c = new char[34]; //字符串最长为 34个字符
c[0] = '0';
c[1] = '.'; //确定开始字符
while(i <= 33) {
num *= 2; //累乘
if(num > 1) { //若结果大于1
num -= 1; //保留小数部分
c[i++] = '1'; //存取整数部分
}else if(num == 1) { //若结果大于0
c[i++] = '1'; //存取结果
break; //退出循环
}
else c[i++] = '0'; //保留整数部位
}
//若 num 为 1 ,成立,返回字符数组第 0 个字符至 第 i 个字符组成的字符串
if(num == 1) return new String(c,0,i);
else return new String("Error");
} class BinDecimal {
public:
string printBin(double num) {
// write code here
if(num >= 1 || num < 0){
return "Error";
}
string str = "0.";
while(num > 0){
if(str.size() > 32){
return "Error";
}
num = num * 2;
if(num >= 1){
str += "1";
num -= 1;
} else {
str += "0";
}
}
return str;
}
};