#include <iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int main() {
char str[10000];
scanf("%s",str);
int len=strlen(str);
if(str[0]=='-') printf("-");
int pos=0;//存放E的 位置
while(str[pos]!='E') pos++;
//指数
int exp=0;
for(int i=pos+2;i<len;i++)
exp=exp*10+(str[i]-'0');
if(exp==0){//指数为零
for(int i=1;i<pos;i++) printf("%c",str[i]);
}
if(str[pos+1]=='-')//指数为负
{
printf("0.");
for(int i=0;i<exp-1;i++) printf("0");
printf("%c",str[1]);
for(int i=3;i<pos;i++) printf("%c",str[i]);
}
else//指数为正
{
for(int i=1;i<pos;i++){//输出移动后的数
if(str[i]=='.') continue;//跳过原小数点
printf("%c",str[i]);
if(i==exp+2&&pos-3!=exp) printf(".");
}
for(int i=0;i<exp-(pos-3);i++) printf("0");//输出多余的 0
}
return 0;
}
方法2
#include <iostream>
#include <string>
#include<string.h>
using namespace std;
int main(){
string a, res;
cin >> a;
int k = 0;
char ch = a[0];
int flag = 0;
while (a[k] != 'E') { //记录有效数字
if (strchr("+0.-", a[k]) == NULL)
flag = 1;
if (isdigit(a[k]) && flag)
res += a[k];
k++;
}
int l = a.substr(a.find('.'), a.find('E')).length() - 3; //记录小数位数
int c = stoi(a.substr(a.find('E') + 1, a.length())); //记录指数
k = c - l;
if (k < 0) {
while (res.length() < abs(k)) //小数位补0
res = '0' + res;
res.insert(res.end() + k, '.'); //插入小数点
if (res[0] == '.') //若是小数之前还需补0
res = '0' + res;
}
else {
while (k--) //整数末尾补0
res += '0';
}
if (ch == '-') //如果是负数还需补负号,切记正数不用
res = ch + res;
cout << res;
return 0;
}