方法:首先处理首位的符号,负号则输出负号,正号不作处理。然后分成指数为正(输出带小数点,不带小数点)和指数为负的情况分别处理。
#include <iostream>
#include <string>
using namespace std;
int main(){
string s;
getline(cin,s);
if(s[0]=='-') printf("-"); //处理系数的负号
s.erase(s.begin());
while(s[0]=='0'){
s.erase(s.begin());
}
for(int i=0;i<s.size();i++){
if(s[i]=='E'){
string exp=s.substr(0,i);
int index=0;
for(int j=i+2;j<s.size();j++){
index=10*index+(s[j]-'0');
}
if(index==0){
cout<<exp;
return 0; //指数为正零或负零特殊情况
}
if(s[i+1]=='+'){ //指数为正
if(exp.size()-2<=index){ //不含小数点
printf("%c",exp[0]);
for(int i=2;i<exp.size();i++)
printf("%c",exp[i]);
index-=(exp.size()-2);
while(index--){
printf("0");
}
}else{ //含小数点
for(int i=0;i<exp.size();i++){
if(s[i]=='.') continue;
if(index==0) printf(".");
printf("%c",exp[i]);
if(i!=0) index--;
}
}
}else{//指数为负
printf("0.");
index--;
while(index--){
printf("0");
}
for(int i=0;i<exp.size();i++)
if(s[i]!='.') printf("%c",exp[i]);
}
break; //跳出循环
}
}
return 0;
}
2.24 更新:
#include <iostream>
#include <string>
using namespace std;
int main(){
string s,valid;
int exp=0;
bool negative=false;
cin>>s;
if(s[0]=='-'){
printf("-");
s.erase(s.begin());
}
for(int i=0;i<s.size();i++){
if(s[i]=='E'){
if(s[i+1]=='-') negative=true;
for(int j=i+2;j<s.size();j++){
exp=10*exp+(s[j]-'0');
}
break;
}
if(s[i]=='.') continue;
else if(s[i]>='1'&&s[i]<='9') valid+=s[i];
else if(s[i]=='0'&&valid.size()>0) valid+=s[i];
}
if(negative){
printf("0.");
for(int i=1;i<exp;i++)
printf("0");
printf("%s",valid.c_str());
}else{
exp++; //
for(int i=0;i<valid.size();i++){
printf("%c",valid[i]);
exp--;
if(exp==0&&i!=valid.size()-1) printf(".");
}
if(exp>0){
while(exp--)
printf("0");
}
}
return 0;
}