[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;//完美结束 
}

猜你喜欢

转载自www.cnblogs.com/lyfoi/p/9191422.html