前言
正文
参考题解
#include<iostream>
#include<algorithm>
using namespace std;
/* 题意:对于任意给定的两个非负实数a,b,问将它们写成保留N位小数的科学计数法后是否相等 注意: 1、本题主要考虑好系数和指数的计算,对于长度小于n的需要在末尾补零 2、注意去除前导0 3、注意0和00.000 是相等的! 且其k值为0 即 3 0 00.000 输出YES 0.000*10^0 */
string a,b;
int n;
string getD(string str,int &k){
string res;
int cnt=0;
if(str[0]=='.'){//属于0.xxxx类型的实数 如0.002456或者0.2456
str.erase(0,1);
while(str[0]=='0'&&str.size()>0){
k--;
str.erase(0,1);
}
cnt=str.size();
if(cnt==0)k=0;//属于0.000的特殊情况
res=str.substr(0,n);
if(n>cnt){//若要求的精度位数比cnt还大则res末尾还要补0
for(int i=0;i<n-cnt;i++)res+='0';
}
}else{//属于小数点前面有非0数的实数或者没有小数点的实数
if(str.find('.')==string::npos){//属于xxxx类型的实数 如2456
cnt=str.size();
k=cnt;
res=str.substr(0,n);
if(n>cnt){
for(int i=0;i<n-cnt;i++)res+='0';
}
}else{//属于x.xxx类型的实数,如2.456
int num=0;
while(num<str.size()){
if(str[num]=='.'){
str.erase(num,1);
break;
}else{
k++;
num++;
}
}
cnt=str.size();
res=str.substr(0,n);
if(n>cnt){
for(int i=0;i<n-cnt;i++)res+='0';
}
}
}
return res;
}
int main(){
cin>>n;
cin>>a>>b;
int k1=0,k2=0;
//去除前导0
while(a.size()>0&&a[0]=='0')a.erase(0,1);
while(b.size()>0&&b[0]=='0')b.erase(0,1);
string res1=getD(a,k1);
string res2=getD(b,k2);
if(res1==res2&&k1==k2){
printf("YES 0.%s*10^%d\n",res1.c_str(),k1);
}else{
printf("NO 0.%s*10^%d 0.%s*10^%d\n",res1.c_str(),k1,res2.c_str(),k2);
}
return 0;
}