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

本文共 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://mwfal.baihongyu.com/

你可能感兴趣的文章
MapReducer之Mapper中的Split切片原理(即影响MapTask数目的原因)
查看>>
Linux下Web服务器应用之网站安全-https
查看>>
微信小程序
查看>>
css - 选择器
查看>>
Element-ui框架Tree树形控件切换高亮显示选中效果
查看>>
【洛谷P1104】生日
查看>>
使用pc控制GOPRO6拍照
查看>>
打开已经存在的excel,取出数据进行处理后,再次写入该表格
查看>>
LeetCode 438. Find All Anagrams in a String
查看>>
Spring MVC数据绑定入门总结
查看>>
(五)Hibernate一级缓存
查看>>
Photoshop CS6 基础知识
查看>>
java如何将char类型的数字转换成int型的数字,而不是Ascii
查看>>
Javascript面向对象(封装、继承)
查看>>
轮播图代码实现
查看>>
ElasticSearch(6.2.2)的java API官方文档的总结 (三)
查看>>
Python学习——小知识点
查看>>
Android 面试精华题目总结
查看>>
SSO单点登录的发展由来以及实现原理
查看>>
笨蛋的难题(二)
查看>>