题目
思路
1.判断第一个字符,'-'则输出;
2.以E为分隔符,找到'E'对应下标i;将下标为[1...i-1]部分保留在字符串n中,将[i+1...结尾]部分保留并转为数字t(标志了要移动的位数与小数点移动方向)。
3.判断t的正负,对应小数点向右或向左移动。
(1) t>0:
当未输出完且当前移动位数<t的绝对值时,依次输出字符串n中非小数点的字符(每一位的数字)
不再输出时,判断退出时的情况:
(1)字符串n已经输出完,但是当前移动位数<t的绝对值,说明小数点要继续右移,则要补0,输出(t的绝对值-当前移动位数)个'0',结束;
(2)当前移动位数=t的绝对值,此时需要输出一次小数点'.',然后将n剩余字符输出
(2) t<0:
小数点向左移动,因为输入的整数部分只有1位,所以左移一定会在左侧补0,因此先输出"0."
然后输出t的绝对值-1个'0'(仅当t的绝对值-1>0时),接着依次输出字符串n中非小数点的字符即可。
代码
#include<cstdio>
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
string s;
int main(){
cin>>s;
if(s[0]=='-') cout<<'-';
s=s.substr(1);
int i=0;
while(s[i]!='E') i++;
string n=s.substr(0,i);
int t=stoi(s.substr(i+1));
int cnt=0,j;
if(t<0){
cout<<"0.";
while(cnt<abs(t)-1){
cout<<"0";
cnt++;
}
for(j=0; j<n.size(); j++){
if(n[j]!='.') cout<<n[j];
}
}
else{
cout<<n[0];
for(j=2; j<n.size()&&cnt<t; j++,cnt++){
cout<<n[j];
}
if(j==n.size()){
while(cnt<t){
cout<<"0";
cnt++;
}
}
else{
cout<<".";
while(j<n.size()){
cout<<n[j];
j++;
}
}
}
return 0;
}