[刷题]算法竞赛入门经典 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 ...
随机推荐
- mysql创建数据表时如何判断是否已经存在?
>>> create table if not exists people(name text,age int(2),gender char(1)); 如上代码表示创建一个名为peo ...
- js鼠标滑轮侧边广告(仅IE可用)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 数据库CAST()函数和CONVERT()函数比较
对简单类型转换,CAST()函数和CONVERT()函数的效果一致,只是语法不同.前者更易使用,而后者的优势是格式化时间和数值.在以下这几种情况,二者一样: 1-1.SELECT CONVERT(de ...
- JavaWeb之Cookie和Session的区别
Cookie和Session的区别 一.cookie机制和session机制的区别 ********************************************************** ...
- 转接IC整理汇总 转接芯片大全
转接口IC大全,信号转换大全EDP输出信号NCS8801 LVDS转EDP.RGB转EDP 封装QFN56 最大分辨率2560*1600用于手机.平板.转接板.液晶驱动板.广告机.可视门铃等等控制器到 ...
- poj 2155 Matrix (二维树状数组)
题意:给你一个矩阵开始全是0,然后给你两种指令,第一种:C x1,y1,x2,y2 就是将左上角为x1,y1,右下角为x2,y2,的这个矩阵内的数字全部翻转,0变1,1变0 第二种:Q x1 y1,输 ...
- 聊聊 Tomcat 的单机多实例
Tomcat 从何而来? 先说 Tomcat 这一单词解释,如果你不是一个开发者,当然它在美国口语中并非是褒义词:如果你是开发者,那你一定听过 Web 应用服务器.Sun 公司和 Tomcat .如你 ...
- 深入tornado中的IOStream
IOStream对tornado的高效起了很大的作用,他封装了socket的非阻塞IO的读写操作.大体上可以这么说,当连接建立后,服务端与客户端的请求响应都是基于IOStream的,也就是说:IOSt ...
- Maven(二)之Maven项目构建演练
从上一篇的讲解中我们知道了什么是Maven,然后它的安装配置,到修改本地仓库,这篇我们用一个实际的例子,带领大家走进我们的Maven之旅.让我们一起来体验一下Maven的高度自动化构建项目的过程. 一 ...
- CSAcademy Beta Round #5 Force Graph
题目链接:https://csacademy.com/contest/arhiva/#task/force_graph/ 大意是有若干个节点,每个节点对应一个二维坐标,节点之间相互有斥力存在.同时有些 ...