Liens
vers les questions Remarque:
1. Il y a des zéros non significatifs dans cette question, c'est-à-dire que 000.01 et 0000123.45 peuvent se produire, vous devez d'abord supprimer les zéros non significatifs.
2. L'idée principale est d'obtenir la partie efficace et la partie exposante du nombre à virgule flottante, si la partie efficace et la partie exposante sont égales, elles sont égales, sinon elles ne sont pas égales.
3. Deux situations peuvent être rencontrées, à savoir les nombres inférieurs à 1 et les nombres supérieurs à 1, qui déterminent si leur partie entière est 0. Si la partie entière n'est pas nulle, l'exposant doit être un nombre positif, et l'exposant peut être obtenu en se déplaçant à droite du chiffre haut vers le point décimal ou la fin; sinon, l'exposant est non positif, s'il n'est pas zéro, le premier chiffre non nul peut être obtenu en décalant vers la droite Index. Le traitement de la chaîne de caractères et le calcul de l'index sont effectués simultanément.
#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;
}