主要思路:将输入的两个字符串转化成科学计数法,然后比较指数和底数是否全部相等。
坑点:
1、0001要正确把前面0删去
2、若数据为0,需要将指数置为0
AC代码如下
#include <iostream>
#include <string>
using namespace std;
const int max_n = 110;
struct science_num{
string di;
int zhi;
} na,nb;
science_num change(string a,int N){
int k = 0;
science_num na;
na.zhi = 0;
na.di.clear();
//去除前导0
while(a.length() > 0 && a[0] == '0') {
a.erase(a.begin());
}
//若a是小于1的数
if(a[0] == '.'){
a.erase(a.begin());
while(a.length() > 0 && a[0] == '0') {
a.erase(a.begin());
na.zhi--;
}
}
//若a不小于,找到可能存在的小数点并删除
else{
while(k < a.length() && a[k] != '.'){
k++;
na.zhi++;
}
if(k < a.length()){
a.erase(a.begin()+k);
}
}
//若a为0,将其置0
if(a.length() == 0){
na.zhi = 0;
}
//预处理完毕,规格化
if(a.length() >= N){
na.di.insert(na.di.begin(),a.begin(),a.begin()+N);
}
else{
na.di.insert(na.di.begin(),a.begin(),a.end());
for(int i = 0 ; i < N - a.length();i++){
na.di += '0';
}
}
return na;
}
int main(){
int N;
string a,b;
cin>>N>>a>>b;
na = change(a,N);
nb = change(b,N);
if(na.di == nb.di && na.zhi == nb.zhi){
cout<<"YES 0."<<na.di<<"*10^"<<na.zhi;
}
else{
cout<<"NO 0."<<na.di<<"*10^"<<na.zhi<<" 0."<<nb.di<<"*10^"<<nb.zhi;
}
return 0;
}