deal函数用于将原数以科学计数法表示:
1.找到小数点的位置,其下标即为指数大小,截取的子串为去掉小数点的子串
2.若没有小数点,则在最后加上小数点,找到其下标
3.截取子串(原字符串去掉小数点)
4.删除前导0,每删除一个前导0,指数减一;若最后子串被删空,则原数为0,令指数等于0
5.比较子串大小和有效位大小,若子串大小更大,则取前有效位数输出;若子串更小,则在后面补0输出;若相等,不处理
6.将小数点移动到最前面并在小数点前面添一个0
#include <iostream>
#include <string>
using namespace std;
string deal(string a,int n){//把字符串a转为科学计数法的形式,n为有效数字即有效位
int k=a.find(".");//k为指数,同时等于小数点在原字符串中的下标
if(k==-1){//若没有小数点,在最后加上小数点,再求k的值
a+=".";
k=a.find(".");
}
string s=a.substr(0,k)+a.substr(k+1);//截取去掉小数点后的子串
while(s.size()&&s[0]=='0'){//若有前导0去掉前导0
s=s.substr(1);
k--;//每去掉一个前导0指数减一
}
if(s.size()==0) k=0;//特判,原数为0,则指数为0
if(s.size()>n){
s=s.substr(0,n);
}else{
s+=string(n-s.size(),'0');
}
return "0."+s+"*10^"+to_string(k);
}
int main(){
int n;
string a,b;
cin>>n>>a>>b;
a=deal(a,n);
b=deal(b,n);
if(a==b){
cout<<"YES "<<a;
}else{
cout<<"NO "<<a<<" "<<b;
}
return 0;
}