题目链接
注意点:
1.本题有前导零,即可能出现000.01和0000123.45的情况,需先去除前导零。
2.主要思路是得到浮点数的有效数部分和指数部分,如果有效数部分和指数部分都相等则相等,否则不等。
3.可能会遇到两种情况,即小于1的数和大于1的数,这决定他们的整数部分是否为0。如果整数部分不为零,则指数必然为正数,可以从高位右移到小数点或末尾来得到指数;否则指数非正,如果不为零的话可以通过右移寻找第一个非零位来得到指数。处理字符串和计算指数是同时进行的。
#include<cstdio>
#include<string>
#include<iostream>
using namespace std;
int n;
string deal(string s,int &e){//对字符串进行处理,e是指数
while(s.length()&&s[0]=='0'){//去除前导零
s.erase(s.begin());
}
if(s[0]=='.'){//去除前导零后首位是小数点,说明该数小于1
s.erase(s.begin());//去掉小数点
while(s.length()&&s[0]=='0'){//寻找第一个非零的数
e--;//计算指数
s.erase(s.begin());//去掉第一个非零的数前面的所有零
}
}
else{//去除前导零后不是小数点,说明该数大于1
e++;//指数自增1
while(e<s.length()&&s[e]!='.'){
//寻找小数点,e既是指数又是下标
e++;
}
if(e<s.length())//找到小数点要删去小数点
s.erase(s.begin()+e);
}
if(s.length()==0){//处理完之后s的长度变为0,说明这个数为0
e=0;
}
int num=0;
string res;
while(num<s.length()&&num<n){//未达到精度且还没全部输出
res+=s[num++];//将该位数加到res末尾
}
while(num<n){//如果全部输出精度仍不够
res+='0';//在末尾加0
num++;
}
return res;
}
int main(){
string a,b;
cin>>n>>a>>b;
int ea=0,eb=0;
a=deal(a,ea);
b=deal(b,eb);
if(a==b&&ea==eb){
cout<<"YES 0."<<a<<"*10^"<<ea;
}
else{
cout<<"NO 0."<<a<<"*10^"<<ea<<" 0."<<b<<"*10^"<<eb;
}
return 0;
}