注意点:
1.数字存储长度不超过9999字节,所以存储字串长度需要大于等于10000。
2.一次性读入字符串,然后分割。pos代表“E”的位置,exp代表指数大小。
int pos=0;
while(str[pos]!='E')
pos++;
3.对于指数处理分三种情况:
1>. 指数=0,直接输出字符串,注意从下标1开始。
2>. 指数<0,输出数字肯定以“0.”开头。然后是exp-1个0,然后输出原字符串,这里没有特殊需要注意的。
3>. 指数>0,需要考虑原数字的长度和exp的大小,判断是否需要输出"."。因此对于原来数中的"."可以直接忽略了。“.”输出位置的判断通过i==exp+2&&pos-3>exp判断,前者表示该点需要输出“.”,后者表示数字长度大于exp才需要输出“.”,需要两者同时满足。
最后就是判断需不需要输出多余的0了。
#include<bits/stdc++.h>
using namespace std;
int main()
{
char str[10000];
int pos,exp=0;
scanf("%s",str);
int i=0,len=strlen(str);
if(str[i]=='-')
printf("-");
for(i;i<len;i++)
if(str[i]=='E')
{
pos=i;
break;
}
for(i+=2;i<len;i++)
exp=exp*10+(str[i]-'0');
if(exp==0)
for(i=1;i<pos;i++)
printf("%c",str[i]);
if(str[pos+1]=='-')
{
printf("0.");
for(i=0;i<exp-1;i++)
printf("0");
for(i=1;i<pos;i++)
if(str[i]!='.') printf("%c",str[i]);
}
else
{
for(i=1;i<pos;i++)
{
if(str[i]=='.') continue;
printf("%c",str[i]);
if(i==exp+2&&pos-3>exp)
printf(".");
}
for(i=0;i<exp-pos+3;i++)
printf("0");
}
return 0;
}