0~1间浮点实数的表示(位运算)

题目描述:给定一个介于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;
	
}

 

评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晴空๓

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值