Codeforces 691C Exponential notation

模拟。

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<iostream>
using namespace std;
typedef long long LL;
const double pi = acos(-1.0), eps = 1e-8;
void File()
{
    freopen("D:\in.txt", "r", stdin);
    freopen("D:\out.txt", "w", stdout);
}
inline int read()
{
    char c = getchar();  while (!isdigit(c)) c = getchar();
    int x = 0;
    while (isdigit(c)) { x = x * 10 + c - '0'; c = getchar(); }
    return x;
}

const int maxn=1000100;
char s[maxn],t[maxn];

void f()
{
    bool x=0;
    int len=strlen(s); for(int i=0;i<len;i++) if(s[i]=='.') x=1;
    if(x==0) s[len]='.', s[len+1]='0';
    else
    {
        if(s[len-1]=='.') s[len]='0';
        else if(s[0]=='.') { for(int i=len;i>=1;i--) s[i]=s[i-1]; s[0]='0'; }
    }
}

void g()
{
    int sz=0; strcpy(t,s); memset(s,0,sizeof s);
    int x; for(int i=0;t[i];i++) if(t[i]=='.') x=i;
    int pos=x-1; for(int i=0;i<x-1;i++) if(t[i]!='0'){ pos=i; break; }
    for(int i=pos;i<=x;i++) s[sz++]=t[i];
    int len=strlen(t); pos=x+1; for(int i=len-1;i>=pos;i--) if(t[i]!='0'){ pos=i; break; }
    for(int i=x+1;i<=pos;i++) s[sz++]=t[i];
}

void out()
{
    int x; for(int i=0;s[i];i++) if(s[i]=='.') x=i;
    int len=strlen(s);
    if(x==1&&s[0]=='0')
    {
        int pos=-1; for(int i=2;i<len;i++) if(s[i]!='0') { pos=i; break; }
        if(pos==-1) printf("0
");
        else
        {
            if(pos==len-1) printf("%cE%d",s[pos],1-pos);
            else
            {
                printf("%c.",s[pos]); for(int i=pos+1;i<len;i++) printf("%c",s[i]);
                printf("E%d
",1-pos);
            }
        }
    }
    else if(x==1&&s[0]!='0')
    {
        if(s[len-1]=='0') printf("%c
",s[0]);
        else printf("%s
",s);
    }
    else if(x!=1)
    {
        int pos=-1; for(int i=len-1;i>=1;i--) if(s[i]!='0'&&s[i]!='.') {pos=i; break;}
        if(pos==-1) printf("%cE%d
",s[0],x-1);
        else
        {
            printf("%c.",s[0]); for(int i=1;i<=pos;i++) if(s[i]!='.') printf("%c",s[i]);
            printf("E%d
",x-1);
        }
    }
}

int main()
{
    memset(s,0,sizeof s); scanf("%s",s);
    f(); g(); out();
    return 0;
}
原文地址:https://www.cnblogs.com/zufezzt/p/5706582.html