问题链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805413520719872
Note:
1.特别注意这个语句一定要放在预处理步骤的最后,否则会后面语句对e进行操作会影响结果。
2.删除erase()语句内是s的位置,删头用s.erase(s.begin()),而判断s的头是不是‘0’要用s[0] == '0';
if(s.length() == 0)//若去除前导后s长度变为0,说明这个数是0
e = 0;
#include<cstdio>
#include<iostream>
#include<string>
using namespace std;
//int N;
string deal(string s,int N, int &e){
int k = 0; //s 的下标
//预处理
//第一步去掉头部的0
while(s.length() > 0 && s[0] == '0')
s.erase(s.begin());
//第二步,统计指数并去掉小数点
if(s[0] == '.'){//去掉前导0后是小数点,说明s是小于1的数
s.erase(s.begin());
while(s.length() > 0 && s[0] == '0'){
s.erase(s.begin());
e--;
}
}else{
while(k < s.length() && s[k] != '.')//寻找小数点
{
k++;
e++;
}
if(k < s.length())//while 结束后k < s.length(),说明碰到了小数点
s.erase(s.begin() + k);//去除小数点
}
if(s.length() == 0)//若去除前导后s长度变为0,说明这个数是0
e = 0;
//预处理完成,当前s头部没有0,中间也没有小数点
int num = 0;
k = 0;
string res;
while(num < N){//当精度每到N
if(k < s.length())
res += s[k++];//只要还有数字, 就加到res末尾
else
res += '0';//否则res末尾添加0
num++; //精度加1
}
return res;
}
int main(){
string s1, s2, s3, s4;
int N;
cin >> N >> s1 >> s2;
int e1 = 0, e2 = 0;
s3 = deal(s1,N,e1);
s4 = deal(s2,N,e2);
if(s3 == s4 && e1 == e2)
cout << "YES 0." << s3 << "*10^"<< e1 << endl;
else
cout << "NO 0." << s3 << "*10^" << e1 << " 0." << s4 << "*10^" << e2 << endl;
return 0;
}