这题可以分两部,先求出要保留的数字部分,再求出指数部分,另外浮点数作为字符串处理时,一定要考虑前导0和末尾0,例如:000.00,0099.800。
给出一组比较容易错的数据:4 0000 0000.00 // YES 0.0000*10^0
#include <iostream>
#include <stdio.h>
#include <string>
using namespace std;
string chop(string str, int n){//获取有效数据
string result = str;
int index = result.find(".");
if(index != string::npos){
result.erase(index,1);
}
while(result.length()>1 && result[0]=='0'){
result.erase(0,1);
}
while(result.length() > n){
result.erase(result.length()-1,1);
}
while(result.length() < n){
result += "0";
}
return result;
}
int getP(string str){//获取指数
string result = str;
while(result.length()>2 && result[0]=='0' && result[1]!='.'){
result.erase(0,1);
}
int index = result.find(".");
if(index ==string::npos){
if(result[0]=='0'){
return 0;
}else{
return result.length();
}
}else{
if(result[0]=='0'){
int m = 0;
while(index+1<result.length() && result[index+1]=='0'){
m--;
index++;
}
if(index+1>=result.length()){
return 0;
}else{
return m;
}
}else{
return index;
}
}
}
int main()
{
int n,len_a,len_b;
string a,b;
cin>>n>>a>>b;
len_a = a.length();
len_b = b.length();
int pa,pb;//计算a b是十的多少次方
pa = getP(a);
pb = getP(b);
string ra=chop(a,n);
string rb=chop(b,n);
if(ra == rb && pa == pb){
cout<<"YES"<<" "<<"0."<<ra<<"*10^"<<pa<<endl;
}else{
cout<<"NO"<<" "<<"0."<<ra<<"*10^"<<pa<<" "<<"0."<<rb<<"*10^"<<pb<<endl;
}
return 0;
}