题目不难,但是想要通过全部的case需要小心,一些特殊的例子要考虑到,比如0.000123, 00.00124, 01.0235, 0.0等
#include <iostream>
#include <string>
using namespace std;
int N;
string DeleteLeaderZero(string A){
string ret;
int dot_pos = A.find('.');
int i = 0;
for(i = 0; i < A.length(); ++i){
if(A[i] != '0')
break;
}
if(dot_pos != string::npos){
if(i == dot_pos && i >= 1)
ret = "0." + A.substr(i + 1, A.length() - i - 1);
else{
ret = A.substr(i, A.length() - i);
}
}else{
ret = A.substr(i, A.length() - i);
}
return ret;
}
bool IsZero(string A){
int i = 0;
for(i = 0; i < A.length(); ++i){
if(A[i] == '.') continue;
if(A[i] != '0')
break;
}
if(i >= A.length())
return true;
return false;
}
void ConvertToScientific(string A, string &out, int &e){
if(IsZero(A)){
out = "0.";
int i = N;
while(i--)
out += '0';
e = 0;
return ;
}
A = DeleteLeaderZero(A);
int dot_pos = A.find('.', 0);
if(dot_pos != string::npos){
if(1 == dot_pos && A[0] == '0'){
A.erase(0, 2);
int j;
for(int i = 0; i < A.length(); ++i){
if(A[i] != '0'){
j = i;
break;
}
}
e = -j;
A = A.substr(j, A.length() - j);
}else{
A.erase(dot_pos, 1);
e = dot_pos;
}
}else{
int len = A.length();
e = len;
}
if(N > A.length()){
int i = N - A.length();
while(i--)
A += '0';
}else{
A = A.substr(0, N);
}
out = "0." + A;
}
int main(){
string A, B;
cin>>N>>A>>B;
string out1, out2;
int e1, e2;
ConvertToScientific(A, out1, e1);
ConvertToScientific(B, out2, e2);
if(e1 != e2){
cout<<"NO "<<out1<<"*10^"<<e1<<" "<<out2<<"*10^"<<e2<<endl;
}else{
bool flag = false;
for(int i = 2; i < out1.length() && i < out2.length(); ++i){
if(out1[i] != out2[i]){
flag = true;
break;
}
}
if(!flag){
cout<<"YES "<<out1<<"*10^"<<e1<<endl;
}else{
cout<<"NO "<<out1<<"*10^"<<e1<<" "<<out2<<"*10^"<<e2<<endl;
}
}
return 0;
}