最开始只能过样例,还是想的太简单,被第二个样例迷惑了,在指数值小于小数点后位数的情况下需要在指定位置添加小数点,并且不能再添多余的0了;在指数值大于小数点后位数的情况下,添多余的0时,添加位数为:指数值-小数点后位数。
弥补以上遗漏点后,还是有两个测试点过不了,这时问题出在了单词不认识上,the exponent’s absolute value is no more than 9999。说明末尾指数位数不一定是样例中给的两位。
结合算法笔记思路才勉强AC,但代码过于冗长难懂:
#include<cstdio>
#include<cstdlib>
#include<cstring>
int exponent(int num){ //指数运算
int t=1;
for(int i=1;i<num;i++){
t*=10;
}
return t;
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt","r",stdin);
#endif
char a[10000];
bool flag=false; //flag确定是小数还是整数,false代表整数
int len,zero=0,num=0,k=0;
scanf("%s",a);
len=strlen(a);
k=len-1;
if(a[0]=='-')printf("-");
while(a[k]!='E'){ //确定指数值,以及是小数还是整数
if(a[k]>='0'&&a[k]<='9')zero+=(a[k]-'0')*exponent(len-k);
else if(a[k]=='-')flag=true;
k--;
}
if(flag){ //小数情况
printf("0.");
for(int j=1;j<zero;j++)printf("0");
int i=1;
while(a[i]!='E'){
if(a[i]>='0'&&a[i]<='9')printf("%c",a[i]);
i++;
}
}else{ //整数情况
int i=1;
while(a[i]!='E'){
if(a[i]>='0'&&a[i]<='9'){
if(zero==-1)printf(".");
printf("%c",a[i]);
zero--;
}
i++;
}
while(zero>=0){
printf("0");
zero--;
}
}
return 0;
}
根据算法笔记给的思路(全程围绕E展开):
#include<cstdio>
#include<cstdlib>
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt","r",stdin);
#endif
char a[10000];
int Eindex=0,e,zero=0;
scanf("%s",a);
if(a[0]=='-')printf("-");
while(a[Eindex]!='E'){ //确定E的位置
Eindex++;
}
e=Eindex+2;
while(a[e]!='\0'){
zero=zero*10+(a[e]-'0');
e++;
}
if(zero==0){ //特判0
for(int i=1;i<Eindex;i++)printf("%c",a[i]);
}
if(a[Eindex+1]=='-'){ //小数
printf("0.");
while(zero>1){
printf("0");
zero--;
}
for(int i=1;i<Eindex;i++){
if(a[i]!='.')printf("%c",a[i]);
}
}else{ //整数
if(Eindex>zero+3){ //加.
for(int i=1;i<Eindex;i++){
if(a[i]!='.')printf("%c",a[i]);
if(i-zero==2)printf(".");
}
}else{ //不加.
int j=1;
while(j<Eindex){
if(a[j]!='.')printf("%c",a[j]);
j++;
}
zero=j-zero;
while(zero<3){
printf("0");
zero++;
}
}
}
return 0;
}