Arithmetic problem | 二进制表示
来源:互联网 发布:软件修改器 编辑:程序博客网 时间:2024/05/18 00:07
题目如下:
给定一个数将其转换为二进制(均用字符串表示),如果这个数的小数部分不能在 32 个字符之内来精确地表示,则返回"ERROR"
。
样例
n = "3.72"
, 返回 "ERROR"
.
n = "3.5"
, 返回 "11.1"
.
解题思路:
这个题用小数乘以2取个位的常规方法显然是不明智的,二进制的拿取来源最好还是从类型上着手。拥有小数部分并能包含32位精度的类型非double莫属,但double是不支持位运算的。那么,把double所在内存copy一块即可。然而,stl内其实提供了一个很友好的容器“bitset”,这也让我们省掉转换字符的麻烦。再者,就是对 double内存分布的了解了。如图:
上图所示,double内存中指数部分,初始值为1023(01111111111),科学记数法E(10)的幂加初始值即为指数所在内存的现状。尾数部分为科学记数法小数点后的所有位,位长度不够52,其余置0。(上述的进制为二进制)。
思路实现代码如下:
void Method(char *c){double d_temp = atof(c);bitset<64> b_temp;memcpy(&b_temp, &d_temp, 8);string b_str = b_temp.to_string();bitset<11> b_exp(b_str, 1, 11);int i_exp = b_exp.to_ulong() - 1023;for (int t = 44 + i_exp; t < b_str.size(); ++t){if (b_str[t] == '1') {printf("ERROR"); return;}}string s_f = b_str.substr(11, i_exp + 1); s_f[0] = '1';string s_b = b_str.substr(12 + i_exp, 32);printf("%s%s.%s",b_str[0]=='1'?"-":"", s_f.data(), s_b.data());}
9 0
- Arithmetic problem | 二进制表示
- Arithmetic problem | 非法二进制数
- Problem K: 二进制表示中1的个数
- A Problem in Arithmetic
- Problem J: Arithmetic Sequence
- Arithmetic problem | 最大间距
- Arithmetic problem | The Triangle
- Arithmetic problem | 书籍复印
- Arithmetic problem | Target Sum
- 二进制表示
- 二进制表示
- 二进制表示
- 二进制表示
- POJ Problem 2562 Primary Arithmetic
- Arithmetic problem | 单词接龙 II
- 定点数二进制表示
- -1的二进制表示
- 二进制整数表示法
- Hive学习笔记 --- Hive的数据类型
- 2567. 【NOIP2011模拟9.17】电话时间 (StandardIO)
- 设计模式-适配器模式
- CodeForces 510B Fox And Two Dots(判断环的存在性,DFS一类题)
- GreenDao 3.X之注解
- Arithmetic problem | 二进制表示
- 嵌入式开发28天(线程)
- HTML <pre>标签
- js调用百度地图接口绘制任意多边形并获取每个点的经纬度
- 一点小感悟
- CListCtrl控件的标题栏添加checkbox
- 2016CCPC网络赛赛后总结——回顾与反思
- Android官方开发文档Training系列课程中文版:后台服务之响应IntentService的处理结果
- Django之MVC(MTV)设计模式