题目描述:给定一个介于0~1之间的实数(如0.625),类型为double,打印它的二进制表示(0.101)。如果该数字无法精确的表用32位以内的二进制表示,则打印"ERROR"。
解题思路:将小数转换成二进制可以每次将小数乘以2。如果大于等于1,那么就在小数点后相应位置填1,然后将整数部分的1消掉只剩下小数部分继续乘以2;如果小于1那么就在相应的位置填0,直到结果为0。比如0.625,第一次乘以2为1.25,去掉1剩下0.25,在小数点后的第一位添1。然后用剩下的0.25继续乘以2变为0.5,不足1,那么在小数点后第二位添加0。继续乘以2,第三次乘以2的时候变为1.0,那么在小数点后第三位添加1。消掉1.0中的1变为0.0,这个时候就不用继续乘以2。此时0.625的二进制已经算出来了,即0.101 。最后统计一下长度,如果大于32证明无法精确的表示那么就打印"ERROR"
java代码:
import java.util.Scanner;
public class 二进制表示浮点实数 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//输入一个介于0~1之间的小数
Scanner sc = new Scanner(System.in);
double num = sc.nextDouble();
StringBuilder sb = new StringBuilder("0."); //使用StringBuilder拼接计算的1和0
while(num>0) {
double r = num*2;
if(r>=1) {
//乘以2结果大于等于1就在相应的位置填1,然后减去1继续乘以2
sb.append("1");
num = r - 1;
}else {
sb.append("0");
num = r;
}
if(sb.length()>32) {
System.out.println("ERROR");
return ;
}
}
System.out.println(sb.toString());
}
}
C++代码:
#include<iostream>
#include<vector>
using namespace std;
int main(){
double num,r;
vector<string> s;
s.push_back("0.");
cin>>num;
while(num>0){
r = num * 2;
if(r>=1){
s.push_back("1");
num = r - 1;
}else{
s.push_back("0");
num = r;
}
if(s.size()>32){
cout<<"ERROR";
return 0;
}
}
for(int i=0;i<s.size();i++){
cout<<s[i];
}
return 0;
}