1.题目描述
2.题目分析
此题不是很难,知识分的情况比较多,分类讨论时细心点,不要少讨论某系情况。
3.代码演示
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
void a1(int x,int y,string str){ //缩小
cout << "0.";
x--;
while(x!=0){
cout << '0';
x--;
}
cout << str[1];
for(int i=3;i<=y-1;i++){
cout << str[i];
}
}
void a2(int x,int y,string str){//扩大
int i1=0,i;;
for(int i=3;i<y;i++){
i1++; //记录小数点后面数的个数
}
if(x>=i1){ //后面直接填0
cout << str[1];
for(int i=3;i<y;i++) cout << str[i];
int q1=x-i1;
while(q1!=0){
cout << 0;
q1--;
}
}
if(x<i1){//次时需要移动小数点
cout << str[1];
for(i=3;i<3+x;i++) cout << str[i];
cout << ".";
for(int k=i;k<y;k++) cout << str[k];
}
}
void Print(int x,int y,string str){
if(x==0){
for(int i=1;i<y;i++ ) cout << str[i]; //直接输出小数本身
}
if(str[y+1]=='-'&&x>0) a1(x,y,str);//缩小
if(str[y+1]=='+'&&x>0) a2(x,y,str);//扩大
}
int main(){
string s,s0;
cin >> s;
int k=0,s1=0,k1=-1;;
for(int i=0;i< s.size();i++){
if(s[i]=='E') {
k=i;//k很关键,起到定位的作用
break;
}
}
for(int j=k+2;j<=s.size();j++) s0[++k1]=s[j];
int res = atoi(s0.c_str()); //atoi()将E后面的字符串转换整形
if(s[0]=='+') Print(res,k,s);//为正
if(s[0]=='-'){ //为负
cout << s[0];
Print(res,k,s);
}
return 0;
}