给定一个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; } };