标签:main amp turn 小数点 ORC std 一个 ati 防止
给定一个长度为\(N\)的数字,转化为 标准的科学计数法形式。\(N\)最大可达\(10^6\)。要考虑前置\(0\) 和 后置 \(0\) 的特殊情况。 当指数为\(0\)的时候,不输出指数部分。
这个题典型的模拟题,注重思想,各种情况要考虑:
1.为0的情况
\(0\)
\(00\)
\(16\)
\(100\)
\(001\)
\(00.0010\)
这么麻烦吗?
其实我们可以用第一个和最后一个不为零的数字的位置 。 在处理一些特别坑的情况,就需要我们化繁为简的大法了! 具体看代码的注释!
代码还是简短的。
//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
标签:main amp turn 小数点 ORC std 一个 ati 防止
原文地址:https://www.cnblogs.com/lyfoi/p/9191422.html