#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<cstdlib>
using namespace std;
const int maxn=10010;
char s[maxn],str[maxn],xi[maxn];
int main()
{
scanf("%s",s);
char sign;
int exp=0,len=strlen(s),index=0,dot,xiao;
for(int i=0;i<len;i++){
if(s[i]=='.') dot=i;
else if(s[i]!='E'){
xi[index++]=s[i];
}
if(s[i]=='E'){
xiao=i-dot-1;
sign=s[i+1];
i+=2;
while(s[i]=='0') i++;
int t=1;
for(int j=len-1;j>=i;j--){
exp+=(s[j]-'0')*t;
t*=10;
}
break;
}
}
if(sign=='+'){
dot+=exp;
if(xi[0]=='-')
printf("-");
for(int i=1;i<index;i++){
if(i==dot && dot<=index-1)
printf(".");
printf("%c",xi[i]);
}
for(int i=1;i<=exp-xiao;i++) printf("0");
}else{
if(xi[0]=='-')
printf("-");
dot-=exp;
int zheng=index-xiao-1;
if(zheng<=exp) printf("0.");
for(int i=1;i<=exp-zheng;i++) printf("0");
for(int i=1;i<index;i++){
if(i==dot && dot>=2)
printf(".");
printf("%c",xi[i]);
}
}
return 0;
}
这里最好根据指数的正负来分别做判断,先循环一次,得到指数数值,小数点位置,小数位数以及不包含小数点的系数数组(这两个也可以不用,并且题目输入点貌似没有指数为0的情况,上面有部分代码是有点多余了。),然后如果指数是正的小数点右移,分为两部分来写,一部分是输出原来的系数数组并把小数点位置找好,另一部分补0,注意小数点如果右移到原系数最后一位则不需要加了。然后考虑指数为负数的情况,即小数点左移(我这里没注意科学计数法整数只有一位数,所以多写了一点东西,可以去掉。。。直接输出0.就可以了),然后也是分为两部分,先补0,然后输出系数数组就行了。
这里最后要注意一下,输出的时候如果是正数那么输入串第一个+号不要输出。
然后这道题和A1073是一样的,我把我以前写的代码贴上去了。(当时有些输入点一直过不了,参考了一下书上才全过的。所以会简洁一点)。
最后给几个书上的测试点可以测试一下:
+3.1415E+004 //31415
-3.1415926E+4 //-31415.926
+3.1415926E-01 //0.31415926
-3.1415926E-0005 //-0.000031415926