[刷题]算法竞赛入门经典 3-12/UVa11809
书上具体所有题目:http://pan.baidu.com/s/1hssH0KO
题目:算法竞赛入门经典 3-4/UVa11809:Floating-Point Numbers
代码:
//UVa11809 - Floating-Point Numbers
#include<iostream>
#include<sstream>
#include<cmath>
long long E[12][33], e;
double M[12][33], m, re;
char str[25], *ps;
int main()
{
for (int i = 0;i <= 9;++i)//M
for (int j = 1;j <= 30;++j) {//E
m = 1 - pow(2, -1 - i);
e = pow(2, j) - 1;
re = log10(m) + log10(2)*e;
E[i][j] = (long long)re;
M[i][j] = pow(10, (re - E[i][j]));
}//打表完成,读入数据
while ((std::cin >> str) && (ps = str) != "0e0") {
while (*++ps != 'e');*ps = ' ';
std::istringstream s(str);
s >> m >> e;
for (int i = 0;i <= 9;++i) {//M
int j;
for (j = 1;j <= 30;++j) {//E
if (E[i][j] == e && (M[i][j] - m < 0.0001 && m - M[i][j] < 0.0001)) {//double达不到15位的精度,但是其实无所谓,差不离就行
std::cout << i << ' ' << j << '\n';
break;
}
}
if (j <= 30) break;
}
}
return 0;
}
分析:这题对我来说有点难,而且一开始做这题时精神状态不佳,磨洋工磨了一下午也没磨出来。甚至一开始看懂了题目但看不懂题意。。然后第二天继续做,在继承了昨天磨了一下午形成的固化思维下,有点思路但是感觉写下来会很烦琐。于是认认真真去网上看大神的思路。又不敢看太多,看太多了就没有自己的思路了完全是抄了,抄完该忘记的还是忘记。
这题主要看了这位大神的博客:http://blog.csdn.net/crazysillynerd/article/details/43339157
首先他是用的打表。这个方法我知道但一直没想到去用过。而这题刚好说了“The input file contains around 300 line of input”,同时有 9 ≥ M ≥ 0 and 30 ≥ E ≥ 1,10*30刚好300,用读表法再好不过。所以这也是我第一次用读表法。。下次就记住了。
然后怎么打表,我又不会了。。真的菜。。主要就是在两个循环里如何计算M和E。看到这位大大用了log什么的看了几眼没看懂,觉得还是自己动手算比较好,于是拿出草稿纸。事实证明草稿纸果真神器一枚,理思路、演算很有帮助。
我们要做的转化是:M x 10^E=m x 2^e(这个e与2.7的那个e无关),m和e可以根据i、j求出,也就是看成常数。那么两边取log10,得lg M + E x lg 2=lg M + e,左式可算出为re,右式E为long long,M为double,且因为使用的科学记数法,1<=M<10(虽然题目上只说0 < M < 10,但这位大神还去测了,题目中给的数据都是大于1的,钻研精神max),所以0 < lg M < 1,所以E = re - lg M,E为re的取整,即强制转化为long long即可,然后M也可求出。。天,这方法比我之前想的不知道快到哪里去了。。。
然后就是根据输入的数据读表,没什么问题。但是注意到那大神用了istringstream。这玩意我在C++Primer上看到过,当时还想着没什么用。现在才知道其威力!当我看到大神那句:
for(string::iterator i = in.begin(); i != in.end(); ++i) if(*i == 'e') *i = ' ';
瞬间让字符串可以直接输入到double和long long,简化了不少的代码!我做题目至今,用来用去就那几个东西,primer上看到的那些东西都没怎么用过。论活学活用的重要性。。。
于是最终。。我写出来的代码还是和那大神的还是太像了。。。跟抄作业的一样。。
[刷题]算法竞赛入门经典 3-12/UVa11809的更多相关文章
- [刷题]算法竞赛入门经典 3-1/UVa1585 3-2/UVa1586 3-3/UVa1225
书上具体所有题目:http://pan.baidu.com/s/1hssH0KO(我也是在网上找到的pdf,但不记得是从哪里搜刮到的了,就重新上传了一遍) PS:第一次写博客分享我的代码,不知道我对c ...
- [刷题]算法竞赛入门经典 3-10/UVa1587 3-11/UVa1588
书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 题目:算法竞赛入门经典 3-10/UVa1587:Box 代码: //UVa1587 - Box #include&l ...
- [刷题]算法竞赛入门经典 3-7/UVa1368 3-8/UVa202 3-9/UVa10340
书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 都是<算法竞赛入门经典(第二版)>的题目,标题上没写(第二版) 题目:算法竞赛入门经典 3-7/UVa13 ...
- [刷题]算法竞赛入门经典 3-4/UVa455 3-5/UVa227 3-6/UVa232
书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 题目:算法竞赛入门经典 3-4/UVa455:Periodic Strings 代码: //UVa455 #inclu ...
- [刷题]算法竞赛入门经典(第2版) 4-6/UVa508 - Morse Mismatches
书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,10 ms) //UVa508 - Morse Mismatches #include< ...
- [刷题]算法竞赛入门经典(第2版) 5-15/UVa12333 - Revenge of Fibonacci
题意:在前100000个Fibonacci(以下简称F)数字里,能否在这100000个F里找出以某些数字作为开头的F.要求找出下标最小的.没找到输出-1. 代码:(Accepted,0.250s) / ...
- [刷题]算法竞赛入门经典(第2版) 5-13/UVa822 - Queue and A
题意:模拟客服MM,一共有N种话题,每个客服MM支持处理其中的i个(i < N),处理的话题还有优先级.为了简化流程方便出题,设每个话题都是每隔m分钟来咨询一次.现知道每个话题前来咨询的时间.间 ...
- [刷题]算法竞赛入门经典(第2版) 4-8/UVa12108 - Extraordinarily Tired Students
书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,0 ms) //UVa12108 - Extraordinarily Tired Stude ...
- [刷题]算法竞赛入门经典(第2版) 4-5/UVa1590 - IP Networks
书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,0 ms) //UVa1590 - IP Networks #include<iost ...
随机推荐
- OSPF相关知识与实例配置【第一部分】
OSPF相关知识与实例配置[基本知识及多区域配置] OSPF(开放式最短路径优先协议)是一个基于链路状态的IGP,相比于RIP有无环路:收敛快:扩展性好等优点,也是现在用的最多的:所以这次实验就针对于 ...
- 使用Python对Excel进行读写操作
学习Python的过程中,我们会遇到Excel的读写问题.这时,我们可以使用xlwt模块将数据写入Excel表格中,使用xlrd模块从Excel中读取数据.下面我们介绍如何实现使用Python对Exc ...
- 手机自动化测试:Appium源码之api(1)
手机自动化测试:Appium源码之api(1) AppiumDriver getAppStrings() 默认系统语言对应的Strings.xml文件内的数据. driver.getAppStri ...
- 手机自动化测试:appium源码分析之bootstrap十五
手机自动化测试:appium源码分析之bootstrap十五 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣 ...
- 2.Redis的基本配置
一.参数配置 redis.conf的主要配置参数的意义: daemonize:是否以后台daemon方式运行 pidfile:pid文件位置 port:监听的端口号 timeout:请求超时时间 lo ...
- JavaScript 数组操作方法
这些数组的操作方法会改变原来的数组.在使用 Vue 或者 Angular 等框架的时候会非常实用,使用这些方法修改数组会触发视图的更新. Array.prototype.push 该方法可以在数组末尾 ...
- ViewPager—02图片无限轮播
布局文件 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:t ...
- Java异常处理机制 —— 深入理解与开发应用
本文为原创博文,严禁转载,侵权必究! Java异常处理机制在日常开发中应用频繁,其最主要的不外乎几个关键字:try.catch.finally.throw.throws,以及各种各样的Exceptio ...
- gulp 学习笔记
以这次学习gulp为契机来同时了解和学习node相关的知识和概念,比如 npm,package.json等,为以后学习node打好基础. 目录 npm 查看模块 安装模块 ...
- Java使用递归找出某目录下的所有子目录以及子文件
/* 使用递归找出某目录("C:\\JavaProducts")下的所有子目录以及子文件 */ import java.util.*; import java.io.*; publ ...