博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PAT A1060 科学记数法经典例题(全string库解决)
阅读量:6000 次
发布时间:2019-06-20

本文共 1338 字,大约阅读时间需要 4 分钟。

clipboard.png

挺操蛋的一道题,我他妈的都服了。。。出这道题我怕是毙了

首先题目里就有几个坑:

1.可能有前导零,比如说000.0001
2.可能有零,比如说000.0000000

哎,思路感觉最重要,对于字符串处理一定要有思路,知道先干嘛,后干嘛;

首先就要去除前导零,把他变成一个纯净的浮点数;

去除前导零,我们就可以进行分类讨论,因为必定会出现两种情况:

1.第一位是小数点,此时该数为小数;
2.第一位是数字,此时该数为大于零的数;

对于第一种情况,我们应该注意e和位数的关系;

例如.0002,其e一定是符号位到第一位不为零的数字的距离,也就是0.2*10^-3。
所以对于第一种情况,只需要寻找第一位不为零的数字,过一位e--,从而使得得到纯净小数的时候,也能得到指数;

注意:两种情况都是不含小数点的数,“0.”后面输出的时候再加

对于第二种情况,我们应该先寻找小数点;

这里e的记录方式和第一种情况类似,每过一位,e++;
比如44.2,我们应该是0.442*10^2,而此时e过了两位;
当我们找到小数点之后,就应该删除小数点,使我们得到纯净的连续数字;

对于以上两种情况,我们都得到了纯净的连续数字,也就是非小数,不包含小数点的数字,接下来就是对保留位数进行判断;

对于一种情况,就是通过以上步骤,00.00,最后得到的序列为空,此时e=0,作为零的特殊情况;

后续就是对精度计算,并且对不足位进行补0操作;

例如现在得到了12,我们要求精度位4位,所以先建立一个空字符串s,遍历的同时对精度位进行计算,当s="12"时,还差两个精度位,所以补两个0,输出s="1200"

最后进行比较的时候就是对指数和保留部分比较,后续输出的时候再s前加上“0.”输出就行;

代码如下所示:

#include
#include
#include
#include
#include
using namespace std;using std::vector;int n;string deal(string s,int& e){ int k=0; while(s.length()>0&&s[0]=='0'){ s.erase(s.begin()); //去除前导零; } if(s[0]=='.'){ //小于零的数字 s.erase(s.begin()); while(s.length()>0&&s[0]=='0'){ s.erase(s.begin()); //找到首位非零元素 e--; } }else{ while(k
>n>>s1>>s2; int e1=0,e2=0; s3=deal(s1,e1); s4=deal(s2,e2); if(s3==s4&&e1==e2){ cout<<"YES 0."<
<<"*10^"<
<

转载地址:http://jmzmx.baihongyu.com/

你可能感兴趣的文章
图神经网络将成AI下一拐点!MIT斯坦福一文综述GNN到底有多强
查看>>
Scrum Guides 2017年最新修改
查看>>
WinDocks发布Windows版本的Docker引擎
查看>>
Oracle加入Eclipse MicroProfile项目
查看>>
Linux基金会的EdgeX Foundry将让IoT支持边缘计算
查看>>
微软发布公开预览版IoT Edge
查看>>
从初创型到独角兽企业,监控架构演进的那些事儿
查看>>
使用 Kanban精益创新
查看>>
InfoQ播客:Tal Weiss谈JVM的可观测性、插桩、以及字节码操作
查看>>
专访黄翀:东方航空到底用MongoDB做了什么,技术选型为何花落MongoDB?
查看>>
微软为无服务器架构引入新API管理消费层
查看>>
干货|基于CPU的深度学习推理部署优化实践
查看>>
有赞电商云应用框架设计
查看>>
Git漏洞导致攻击者可在用户电脑上运行任意代码
查看>>
研究发现,近一半生产容器存在漏洞
查看>>
JavaOne 2016——首日亮点
查看>>
Juval Löwy:为什么每个类都应该是一个服务
查看>>
波音737事故,软件化要不要“背锅”?
查看>>
为什么携程要做好持续交付?
查看>>
NetBeans第一部分代码提交Apache
查看>>