书上具体所有题目: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的更多相关文章

  1. [刷题]算法竞赛入门经典 3-1/UVa1585 3-2/UVa1586 3-3/UVa1225

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO(我也是在网上找到的pdf,但不记得是从哪里搜刮到的了,就重新上传了一遍) PS:第一次写博客分享我的代码,不知道我对c ...

  2. [刷题]算法竞赛入门经典 3-10/UVa1587 3-11/UVa1588

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 题目:算法竞赛入门经典 3-10/UVa1587:Box 代码: //UVa1587 - Box #include&l ...

  3. [刷题]算法竞赛入门经典 3-7/UVa1368 3-8/UVa202 3-9/UVa10340

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 都是<算法竞赛入门经典(第二版)>的题目,标题上没写(第二版) 题目:算法竞赛入门经典 3-7/UVa13 ...

  4. [刷题]算法竞赛入门经典 3-4/UVa455 3-5/UVa227 3-6/UVa232

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 题目:算法竞赛入门经典 3-4/UVa455:Periodic Strings 代码: //UVa455 #inclu ...

  5. [刷题]算法竞赛入门经典(第2版) 4-6/UVa508 - Morse Mismatches

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,10 ms) //UVa508 - Morse Mismatches #include< ...

  6. [刷题]算法竞赛入门经典(第2版) 5-15/UVa12333 - Revenge of Fibonacci

    题意:在前100000个Fibonacci(以下简称F)数字里,能否在这100000个F里找出以某些数字作为开头的F.要求找出下标最小的.没找到输出-1. 代码:(Accepted,0.250s) / ...

  7. [刷题]算法竞赛入门经典(第2版) 5-13/UVa822 - Queue and A

    题意:模拟客服MM,一共有N种话题,每个客服MM支持处理其中的i个(i < N),处理的话题还有优先级.为了简化流程方便出题,设每个话题都是每隔m分钟来咨询一次.现知道每个话题前来咨询的时间.间 ...

  8. [刷题]算法竞赛入门经典(第2版) 4-8/UVa12108 - Extraordinarily Tired Students

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,0 ms) //UVa12108 - Extraordinarily Tired Stude ...

  9. [刷题]算法竞赛入门经典(第2版) 4-5/UVa1590 - IP Networks

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,0 ms) //UVa1590 - IP Networks #include<iost ...

随机推荐

  1. Luogu1486郁闷的出纳员【Splay】

    P1486 郁闷的出纳员 题目描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反 ...

  2. 【 Android】自定义的AlertDialog中的EditText无法调用输入法问题解决

    1.问题描述: 在自定义的AlertDialog 中添加了EditText组件,但运行时怎么点EditText都无法调出软键盘: 2.原因分析: 一开始我以为EditText的focus属性没有设置好 ...

  3. html中的Flash对象

    开源Flash播放器 http://www.open-open.com/ajax/Video.htm

  4. 取消putty右键粘贴功能

    还是非常喜欢putty的.就是右键默认的粘贴功能比较讨人厌.

  5. mock.js-无需等待,随机产生数据,让前端独立于后端进行开发

    mock.js所做的 基于 数据模板 生成模拟数据. 基于 HTML模板 生成模拟数据. 拦截并模拟 ajax 请求. Mock.js官方网址:http://mockjs.com/ 1.Mock.js ...

  6. Android中实现定时器的四种方式

    第一种方式利用Timer和TimerTask 1.继承关系 java.util.Timer 基本方法 schedule 例如: timer.schedule(task, delay,period); ...

  7. backdrop-filter 和filter 写出高斯模糊效果 以及两者区别

    http://www.w3cplus.com/css3/advanced-css-filters.html: backdrop-filter:blur(10px);只支持ios端:只作用于当前元素: ...

  8. App字体大小不随系统改变而改变

    转载请注明出处:http://www.cnblogs.com/cnwutianhao/p/6713724.html 在 "设置" , "显示" , " ...

  9. mapTask并行度优化及源码分析

    mapTask并行度的决定机制 一个job的map阶段并行度由客户端在提交job时决定,而客户端对map阶段并行度的规划的基本逻辑为:将待处理数据执行逻辑切片(即按照一个特定切片大小,将待处理数据划分 ...

  10. IO流输入 输出流 字符字节流

    一.流 1.流的概念 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作. ...