程序员面试金典: 9.5位操作5.2对一个浮点数,打印它的二进制表示

原创 2017年01月03日 12:22:37
#include <iostream>
#include <stdio.h>
#include <string>
#include <vector>

using namespace std;

/*
问题:给定一个介于0和1之间的实数(如0.72),类型为double,打印它的二进制表示。如果该数字无法精确地用32位以内的二进制表示,则打印"ERROR"
分析:其实就是浮点数转二进制整数。十进制浮点数转二进制的规则是:将数字N乘2取整,如果计算结果R为1就退出,否则如果计算结果R>1,则取1,
      并使得N=R-1;如果R<1,则取0,。
	  重复上述处理,直到超过指定计算次数就退出。
      将取整后的数字放在"0."后面依次排列好,即为所求
输入:
0.25
0.72
输出
0.01
ERROR
*/

//将十进制小数(介于0~1之间)转化为二进制小数
vector<int> toBinarySystem(string& num)
{
	vector<int> vecResult;
	if(num.empty())
	{
		return vecResult;
	}
	//判断第一位是否为0,如果大于0,不符合要求
	int value = num[0] - '0';
	if(value > 0)
	{
		return vecResult;
	}
	//将字符串转化为小数
	double dNum = atof(num.c_str());
	int count = 0;
	
	do{
		if(count >= 32)
		{
			break;
		}
		dNum *= 2;
		//如果结果恰好为1,将1存入结果
		if( fabs(dNum - 1) < 1e-6 )
		{
			vecResult.push_back(1);
			break;
		}
		else
		{
			if( dNum > 1)
			{
				dNum -= 1;
				vecResult.push_back(1);
			}
			else
			{
				vecResult.push_back(0);
			}
		}
		count++;
	}while(true);
	if(count >= 32)
	{
		vecResult.clear();
	}
	return vecResult;
}

int main(int argc, char*argv[])
{
	string num;
	while(cin >> num)
	{
		vector<int> vecResult = toBinarySystem(num);
		if(vecResult.empty())
		{
			cout << "ERROR" << endl;
		}
		else
		{
			vector<int>::iterator it;
			cout << "0." ;
			for(it = vecResult.begin() ; it != vecResult.end() ; it++)
			{
				cout << (*it) ;
			}
			cout << endl;
		}
	}
	getchar();
	return 0;
}

程序员面试金典: 9.5位操作 5.7寻找丢失的整数

#include #include #include #include using namespace std; /* 问题:数组A包含0到n的所有整数,但其中缺了一个。在这个问题中,只用...

程序员面试金典: 9.5位操作 5.8通过位操作进行两点连线

#include #include #include #include #include using namespace std; /* 问题:有个单色屏幕存储在一个一维字节数组中,使得...

程序员面试金典——解题总结: 9.17中等难题 17.7给定一个整数,打印该整数的英文描述(例如 "One Thousand,Two Hundred-Thirty Four")

#include #include #include #include #include #include using namespace std; /* 问题:给定一个整数,打印该整...

由一道程序员面试宝典引出的问题-printf如何读入浮点数!

在讲这个题目之前,预备知识,讲一下,printf函数,输入参数是读入缓冲区保存,再按照%?的格式从缓冲区中读出数据,并据此格式解释数据。有了这个知识之后,在讲程序员面试宝典上看到一个题:view pl...
  • wxhhkhl
  • wxhhkhl
  • 2011年01月08日 13:48
  • 358

显示整数 浮点数的二进制表示

  • 2011年06月05日 10:25
  • 9KB
  • 下载

程序员面试金典——解题总结: 9.17中等难题 17.3设计一个算法,算出n阶乘有多少个尾随0

#include #include using namespace std; /* 问题:设计一个算法,算出n阶乘有多少个尾随0 分析: 发现凡是n!中寻找出1~n中5的倍数的5的指数累加和k...

程序员面试金典: 9.4树与图 4.1实现一个函数检查二叉树是否平衡。

#include #include #include using namespace std; /* 问题:实现一个函数,检查二叉树是否平衡。在这个问题中,平衡树的定义如下:任意一个节点,其...

程序员面试金典:下一个最大元素

1.下一个较大元素 2.下一个较大元素(2) 题目描述     现在我们有一个int数组,请你找出数组中每个元素的下一个比它大的元素。给定一个int数组A及数组的大小n,请返回一个int数组,代...

程序员面试金典——解题总结: 9.18高难度题 18.6设计一个算法,给定10亿数字,找出最小的100万个数字。假定计算机内存足以容纳全部10亿个数字。

#include #include #include using namespace std; /* 问题:设计一个算法,给定10亿数字,找出最小的100万个数字。假定计算机内存足以容纳全部1...

程序员面试金典: 9.4树与图 4.2给定有向图,设计一个算法,找出两个节点之间是否存在一条路径。

#include #include #include #include using namespace std; /* 问题:给定有向图,设计一个算法,找出两个节点之间是否存在一条路径。 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:程序员面试金典: 9.5位操作5.2对一个浮点数,打印它的二进制表示
举报原因:
原因补充:

(最多只允许输入30个字)