程序员面试金典: 9.5位操作5.2对一个浮点数,打印它的二进制表示
2017-01-03 12:22
423 查看
#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; }
相关文章推荐
- Android和JAVA面试题相关资料
- 程序员面试金典: 9.5位操作5.1两个整数的位合并
- Facebook面试题 Remove duplicates from array where all duplicate numbers are located adjacently
- JAVA面试中问及HIBERNATE与 MYBATIS的对比,在这里做一下总结
- 关于PHP程序员解决问题的能力
- Java Web架构知识整理——记一次阿里面试经历
- 程序员最好的阅读书籍,受益终身
- 为什么国外程序员爱用Mac?
- “五步”,让简历入HR法眼!
- Facebook面试题 check for subText in input text's subarray.
- 面试题
- LeetCode-二分查找面试题目总结
- java多线程面试题
- Java研发方向如何准备BAT技术面试答案(上)
- 如何成为杰出的程序员或软件工程师?(对所做的事情的理解越深,你就会做的越好;要有上进心)
- 从一个程序员的角度看——微信小应用
- Java面试题
- java面试常见基础知识点(二)
- 提个问题:从技术到人生
- 为什么程序员应该要尝试写一写博客