前言

传送门

正文

参考题解

#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;
}