测试点4
要考虑这种情况:
+1.234564E+2
三刷
还是死在了测试点4上。
#include<iostream>
using namespace std;
int main(){
string s;
cin>>s;
if(s[0]=='-') cout<<'-';
int loc=s.find('E');
int temp=stod(s.substr(loc+1));
int loc1=s.find('.');
string s1=s.substr(1,loc1-1);
string s2=s.substr(loc1+1,loc-loc1-1);
if(temp<0){
cout<<"0.";
for(int i=0;i<abs(temp)-s1.size();i++) cout<<"0";
cout<<s1+s2;
}else if(temp>0&&temp>=loc-loc1-1){
cout<<s1+s2;
for(int i=0;i<temp-s2.size();i++) cout<<"0";
}else if(temp>0&&temp<loc-loc1-1){
string s3=s.substr(loc1+1,temp);
string s4=s.substr(loc1+3,loc-(loc1+1+temp));
cout<<s1<<s3<<'.'<<s4;
}
return 0;
}
二刷
一开始还是没思路,但是瞄了一眼y总的题解,秒懂。
主要还是运用sunstr()来解,对了还有string(int n, char c); //使用n个字符c初始化
#include<iostream>
using namespace std;
int main(){
string s;
cin>>s;
if(s[0]=='-') cout<<'-';
int loc=s.find('E');
int loc1=s.find('.');
int temp=stoi(s.substr(loc+1));
if(temp<0) {
string s1=string(abs(temp)-1,'0')+s.substr(1,loc1-1)+s.substr(loc1+1,loc-loc1-1);//连char都能加到字符串上
cout<<"0."<<s1;
}else{
if(loc-loc1-1>temp) {
if(temp==0) cout<<s.substr(1,loc-1);
else{
string s2=s.substr(1,loc1-1)+s.substr(loc1+1,temp)+"."+s.substr(loc1+1+temp,loc-loc1-temp-1);
cout<<s2;
}
}
else {
string s2=s.substr(1,loc1-1)+s.substr(loc1+1,loc-loc1-1)+string(temp-loc+loc1+1,'0');
cout<<s2;
}
}
return 0;
}
柳神题解
一点思路都没有,直接看答案吧
分析:n保存E后⾯的字符串所对应的数字,t保存E前⾯的字符串,不包括符号位。当n<0时表示向前移
动,那么先输出0. 然后输出abs(n)-1个0,然后继续输出t中的所有数字;当n>0时候表示向后移动,那
么先输出第⼀个字符,然后将t中尽可能输出n个字符,如果t已经输出到最后⼀个字符(j == t.length())那
么就在后⾯补n-cnt个0,否则就补充⼀个⼩数点. 然后继续输出t剩余的没有输出的字符~
#include<string>
#include <iostream>
using namespace std;
int main() {
string s;
cin >> s;//-1.234E+10
int i = 0;
while (s[i] != 'E') i++;
string t = s.substr(1, i - 1);//去除正负号:t=1.234
int n = stoi(s.substr(i + 1));//+10
if (s[0] == '-') cout << "-";
if (n < 0) {
cout << "0.";
for (int j = 0; j < abs(n) - 1; j++) cout << '0';
for (int j = 0; j < t.length(); j++)
if (t[j] != '.') cout << t[j];
}else {
cout << t[0];
int cnt, j;
for (j = 2, cnt = 0; j < t.length() && cnt < n; j++, cnt++) cout <<
t[j];
if (j == t.length()) {
for (int k = 0; k < n - cnt; k++) cout << '0';
}
else {
cout << '.';
for (int k = j; k < t.length(); k++) cout << t[k];
}
}
return 0;
}