CodeForces691C 【模拟】

这一题的模拟只要注意前后导零就好了。。。
感受就是。。。
如果是比赛中模拟题打好。。要盯着注意点,测试不同的情况下的注意点。。起码要针对性测试10分钟。。
还是蛮简单的,但是自己打烦了,应该,队友代码窝的一半。。。
思路:
还是搞成a*10^b,然后保证1<=a<10,b!=0;

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e6+10;
char s[N];
char a[N];
char b[N];
bool judge_special()
{
    int num=0;
    int flag=0;
    int len=strlen(s);
    for(int i=0;i<len&&s[i]!='.';i++)
    {
        if(s[i]=='.') break;
        if(!flag&&s[i]!='0')
        {
            num++;
            flag=1;
        }
        else if(flag&&s[i]>='0'&&s[i]<='9')
            num++;
        if(num>1)
            return false;
    }
    if(num==1)
        return true;
    else
        return false;
}
void solve_special()
{
    int i,j;
    int len=strlen(s);
    for(i=0;i<len;i++)
    {
        if(s[i]>='1'&&s[i]<='9')
        {
            printf("%c",s[i]);
            break;
        }
    }
    int k;
    for(j=len-1;j>i+1;j--)
    {
        if(s[j]!='0')
        {
            for(k=i+1;k<=j;k++)
                printf("%c",s[k]);
            return;
        }
    }
}
int make_pre()
{
    int num=0;
    int flag=0;
    int len=strlen(s);
    for(int i=0;i<len;i++)
    {
        if(s[i]=='.') break;
        if(!flag&&s[i]!='0')
        {
            num++;
            flag=1;
        }
        else if(flag&&s[i]>='0'&&s[i]<='9')
            num++;
    }
    return num;
}
bool judge_zero(int k)
{
    int len=strlen(s);
    for(int i=len-1;i>k;i--)
    {
        if(s[i]!='0'&&s[i]!='.')
            return false;
    }
    return true;
}
void solve_pre(int num)
{
    int i,j,k;
    int len=strlen(s);
    int flag=0;
    int flat=1;
    for(i=0;i<len;i++)
    {
//        printf("aa
");
        if(s[i]=='.') break;
        if(!flag&&s[i]!='0')
        {
            printf("%c",s[i]);
            flag=1;
            if(judge_zero(i))
            {
                printf("E%d",num-1);
                return;
            }
            else
            {
                printf(".");
                for(j=len-1;j>i;j--)
                {
                    if(s[j]!='0'&&s[j]!='.')
                        break;
                }
                for(k=i+1;k<=j;k++)
                {
                    if(s[k]=='.') continue;
                    printf("%c",s[k]);
                }
            }
        }
    }
    printf("E%d
",num-1);
}
void solve_next()
{
    int len=strlen(s);
    int num=0;
    int k;
    for(int i=0;i<len;i++)
    {
        if(s[i]=='.')
        {
            k=i;
        }
        if(s[i]!='0'&&s[i]!='.')
            num++;
    }
    if(num==0)
    {
        puts("0");
        return;
    }
    if(num==1)
    {
        int sum=1;
        for(int i=k+1;i<len;i++,sum++)
        {
            if(s[i]!='0')
            {
                printf("%cE-%d",s[i],sum);
                return;
            }
        }
    }
    int flag=0;
    int sum=0;
    for(int i=len-1;i>k;i--)
    {
        if(s[i]!='0')
        {
            for(int j=k+1;j<=i;j++)
            {
                if(!flag)
                    sum++;
                if(!flag&&s[j]!='0')
                {
                    printf("%c",s[j]);
                    flag=1;
                    printf(".");
                }
                else if(flag&&s[j]>='0'&&s[j]<='9')
                    printf("%c",s[j]);
            }
            printf("E-%d",sum);
            return;
        }
    }
}

int main()
{
    scanf("%s",s);
    if(judge_special())
    {
        solve_special();
        return 0;
    }
    int num=make_pre();
//    printf("%d
",num);

    if(num==0)
    {
        solve_next();
    }
    else
    {
        solve_pre(num);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934756.html