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\n"); 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\n",1-pos); } } } else if(x==1&&s[0]!='0') { if(s[len-1]=='0') printf("%c\n",s[0]); else printf("%s\n",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\n",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\n",x-1); } } } int main() { memset(s,0,sizeof s); scanf("%s",s); f(); g(); out(); return 0; }