[CodeForces691C]Exponential notation
Posted lyfoi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[CodeForces691C]Exponential notation相关的知识,希望对你有一定的参考价值。
Translate
给定一个长度为(N)的数字,转化为 标准的科学计数法形式。(N)最大可达(10^6)。要考虑前置(0) 和 后置 (0) 的特殊情况。 当指数为(0)的时候,不输出指数部分。
思路:
这个题典型的模拟题,注重思想,各种情况要考虑:
1.为0的情况
(0)
(00)
- (0.0)
2.没有小数点的情况 (16)
(100)
(001)
- (1)
3.带小数点的情况 - (100.)
- (100.00)
- (01.00)
- (1.010)
- (12.1)
(00.0010)
这么麻烦吗?
其实我们可以用第一个和最后一个不为零的数字的位置 。 在处理一些特别坑的情况,就需要我们化繁为简的大法了! 具体看代码的注释!
代码还是简短的。
Code
//ps:毒瘤题,坑死人了!
//注释可能有点文字上的错误
#include<bits/stdc++.h> //万能头文件
using namespace std;
char s[1000005];//开大一点
int main()
{
cin>>s;
int n=strlen(s);
int m=n,k=-1,l=n;
//m表示点的位置,若输入中不含点则默认点在最后
//k、l分别表示第一个和最后一个不为零的数字的位置
//至于为什么k=-1在下面2个原因,可以说这题的化繁为简之处就在k=-1上!
for(int i=0;i<n;i++)
{
if(s[i]=='.')
m=i;
//如果发现小数点那么就记住 ,下面带来一个坑点:
//经过我的测试竟然有,不止一个小数点!!!所以就留最后一个(神tm情况) 。
if(s[i]!='.'&&s[i]!='0'&&k==-1) k=i;
//我们要防止他不断更新,但是break不行!!!
//因为我们此时可能还没找到点的位置! 这就是k=-1的一个原因 !
}
for(int i=n-1;i>=0;i--)
{
if(s[i]!='.'&&s[i]!='0')
{
l=i;
break;//这里找到后就可以直接跳出哦。
}
}
if(k==-1) cout<<"0"<<endl;
//k=-1说明全为零或点,避免的量计算也是k=-1的另一个原因
else
{
cout<<s[k]; //先输出第一个数字,也就是a
if(l!=k) cout<<"."; //说明不为零的数字不止一个,所以输出点
for(int i=k+1;i<=l;i++)
{
if(s[i]!='.') cout<<s[i]; //输出后面的数字
//注意虽然上面输出点了,但是不代表点被排除了!
}
int e; //计算幂次
if(k>m) e=m-k;//点可能在k前后2个方向(小学数学)
else e=m-k-1;
if(e!=0) cout<<"E"<<e<<endl;//注意e是否为0!e不为0 就输出e。
else cout<<endl;//e为0,处理完了!
}
return 0;//完美结束
}
以上是关于[CodeForces691C]Exponential notation的主要内容,如果未能解决你的问题,请参考以下文章
tensorflow中moving average的正确用法