题目大意:计算机常用阶码-尾数的方法保存浮点数。如 图3-9所示,如果阶码有6位,尾数有8位,可以表 达的最大浮点数为0.1111111112×21111112。注意小 数点后第一位必须为1,所以一共有9位小数。

这个数换算成十进制之后就是 0.998046875263=9.2053576383452941018。你的 任务是根据这个最大浮点数,求出阶码的位数E 和尾数的位数M。输入格式为AeB,表示最大浮 点数为A*10^B。0<A<10,并且恰好包含15位有效 数字。输入结束标志为0e0。对于每组数据,输 出M和E。输入保证有唯一解,且0≤M≤9, 1≤E≤30。在本题中,M+E+2不必为8的整数倍。

在第一次看见这道题的时候,确实没什么思路。但是细想后,也并不是毫无头绪。

首先,我们分析后知道,输出的是阶码和位数,并且题目的数据比较小。那么我们要从哪方面入手呢。

没错就是进制,通过二进制转十进制的思路,我们从数学的思路分析。m = 2^(-1) + 2^(-2) + … + 2^(-1 - i)(i比实际1的个数少1个),所以从等比数列的性质(错位相减求前n项和),我们求出m = 1 - 2^(-1 - i)。二进制的阶码,我们可以从相同的方式推出,e=(2^n)-1(均由数学等比数列推出,可自行推导e,不要懒,多思多动手才能进步.0^0)。那么现在就简单多了。我们只需根据m * 2^e = A * 10^B计算就行了?当然不会这么简单了。

首先要考虑的就是数据范围为问题当e比较大的时候,会炸long long 的范围,导致我们的结果出错。其次就是误差的问题,由次数幂的关系可知,左右两边很难完全相同,所以我们要控制一定的误差。在此基础上,我们可以通过将两式相等来简化问题。至于数据的问题,我们需要数学函数(log)的帮助。对两边同时对10取对数。(等号是近似取的,一定要注意)。

当时有人问过我,m和e的范围都不过32,为什么会炸,这里解释一下,那个范围是二进制的数字个数,转为10进制,2的指数最大大概为1073741823。所以数据范围会出错。

那么现在我们的问题就简单多了。我们把右边的式子设为未知数x;然后判断两式相减是否在一个允许的误差内。即(log10(m)+e*log10(2)-x)<1e-5。成立即可;

另外输入时候,有些写法是用字符串储存浮点数,使用了sscanf进行分割。但是本题的输入可以简化。只要用scanf和double。这一题还可以打表计算,将所有可能的值储存在二维数组内,寻找最接近的一个值。最后暴力ac的代码贴下。

#include<stdio.h>
#include<math.h>
#include<cmath>
using namespace std;
int main()
{double a;int b;while(scanf("%17lfe%d",&a,&b)&&(a!=0))//注意输入的时候用%17lf卡极限,%16lf的部分输出会出错。{int m,e;double k,t;double x=log10(a)+b;int l=1;// 标记;for(m=0;m<=9;m++){k=1-pow(2,-(m+1));for(e=0;e<=30;e++){t=pow(2,e)-1;if((log10(k)+t*log10(2)-x)<1e-5&&(log10(k)+t*log10(2)-x)>-(1e-5))//精度判断,可以用abs函数简化。{//abs(log10(k)+t*log10(2)-x)<1e-5l=0;//满足条件即可输出。break;}}if(l==0) break;}printf("%d %d\n",m,e);}
}

刘汝佳算法竞赛入门 UVA-11809 Floating-Point Numbers 暴力写法。相关推荐

  1. 刘汝佳算法竞赛入门经典 第二单元习题答案自编

    欢迎交流讨论! @2-1 #include <fstream> using namespace std;ifstream fin("aplusb.in"); ofstr ...

  2. 刘汝佳算法竞赛入门例题-循环部分

    今天是学习acm的第一天,记录一些学习的心得. p34-韩信点兵         简要题干:输入a.b.c,表示军队人数模3,模5,模7的余数                           输出 ...

  3. 刘汝佳算法竞赛入门经典第三章习题

    /*给出一些容易理解的解题方法  但是没有oj评测 所以无法保证一定正确  矩阵的旋转给出了左旋和右旋 不确定题目3-5是哪一种*/ 习题3-1分数统计(stat) 输入一些学生的分数,哪个分数出现的 ...

  4. 刘汝佳算法竞赛入门习题3-3

    题目:数数字 把n(n≤10000)个整数顺次写在一起:1234567891011112······数一数0~9各出现多少次 代码如下: #include<stdio.h> #includ ...

  5. 刘汝佳算法竞赛第二版习题3-2思路

    最近在看刘汝佳编写的紫皮算法书,第三章后面有个习题,尝试写了一下,总感觉能找到更加便利的解题方法,但能力有限没想到. 上网搜索了一下,也没找到能让我眼前一亮的方法,那就暂且把我写的shi山放出来让大伙 ...

  6. 刘汝佳算法入门笔记(1)

    刘汝佳算法入门笔记 习题4-2 习题4-2 有n行n列(2≤n≤9)的小黑点,还有m条线段连接其中的一些黑点.统计这些线段连成 了多少个正方形(每种边长分别统计). 行从上到下编号为1-n,列从左到右 ...

  7. 破损的键盘(刘汝佳-算法入门经典第六章)

    感谢原文博主对此题的解释!笔者在原文基础上进行了部分注释以表达自己的理解,如有错误,恳请指正! 原文链接:https://blog.csdn.net/gyh_420/article/details/7 ...

  8. 算法竞赛入门经典:第七章 暴力求解法 7.7解答树

    /* 解答树: 以下的树显示了排列递归函数的调用过程. (****) (1***) (2***) (3***) (4***) (12**) (13**) (14**) (21**) (23**)(24 ...

  9. 算法竞赛入门(2)学习笔记——循环结构程序设计

    C语言学习 一:for循环 二:while循环和do-while循环 三:循环的代价 四:算法竞赛中的输入输出框架 五:习题 5.1 水仙花数 5.2 韩信点兵 5.3 倒三角形 5.4 子序列的和 ...

最新文章

  1. oss对象存储服务操作
  2. 一个实用技巧,告别手动画图,自动生成数据库 ER 图|原创
  3. FBI再度要求苹果协助为波士顿黑帮成员的iPhone解锁
  4. 数据结构(莫队算法):国家集训队2010 小Z的袜子
  5. SD-WAN的出现对MPLS意味着什么?
  6. HTML标签meta在seo中的作用
  7. cus.crm.myaccounts.util.Util.isIntentSupported
  8. Navicat Premium连接SQL Server
  9. 廖雪峰讲python高阶函数求导公式_高阶函数 - 廖雪峰 Python 2.7 中文教程
  10. 在Module中使用自定义过滤器,来统一对站内所有请求响应的输出内容进行采集或更改。...
  11. [C/C++] C/C++延伸学习系列之STL及Boost库概述
  12. qt 批量裁剪图片_下载王APP批量保存视频号视频、免费短视频去水印、4K高清视频下载...
  13. mx350显卡天梯图_显卡天梯图2020年终整理发布
  14. python生成excel文件二维码_Python实现读取Excel表内容批量生成二维码
  15. Docker安装(有网环境下) 最新版docker-ce安装教程
  16. 新版标准日本语高级_第5课
  17. ftp连接服务器失败:响应:220-FileZilla Server version 0.9.24 beta 响应:220-written by Tim Kosse (Tim.Kosse@gmx.d
  18. spring boot redisLock redis分布式锁
  19. 浏览器百家争鸣,国产能打的浏览器来了!
  20. 抖音小店开店前要准备什么?入驻流程是什么?

热门文章

  1. 深富策略:三大指数联袂反攻 量能变化需重视!
  2. lavaral中文手册_Laravel-mix 中文文档
  3. SQLyog安装过程
  4. 「小目标」背后的“大意义”
  5. OPENV接收和发送串口的数据
  6. 图数据库hugegraph如何快速导入10亿+数据
  7. win11怎么升级更新显卡驱动
  8. 计算机驱动空间不够,为何我的电脑在安装显卡驱动的时候就是安装不成功,提示是磁盘空间不足,但是其余的磁盘都有130GB左右...
  9. java计算机毕业设计vue开发一个简单音乐播放器源码+mysql数据库+系统+lw文档+部署
  10. 怎么选择好用的超级浏览器?