总思路是把两个数都变成科学计数法然后比较有效位和指数是否相同。
具体操作:
(1)先要去掉前导零。如果是“000000”这种情况,去完前导零后字符串就没了,这时候要让指数e为0
(2)此时可能字符串的第一位是小数点,这个时候把小数点去掉,然后找字符串中第一个不为零的字符所在的位置,并且把首个不为零的的字符前的所有零都去掉。另外每出现一个0,e--。注意有可能字符串是000.00000的情况,如果是这种情况要让e为0
(3)此时字符串的第一位不是小数点而是一个非零数,去找小数点的位置然后去掉小数点,另外小数点前有几位数e就加几。
(4)此时声明一个string类型的变量ans,根据题目要求的位数把字符串中的字符导入ans,如果不够在ans后面添0,最后返回ans。
以上就是solve函数的思路。
#include<cstdio>
#include<string>
#include<iostream>
using namespace std;
/*去掉前导零
变为科学计数法
*/
string solve(string s,int &e, int n)
{
e = 0;
string ans;
while(s.size()>0&&s[0]=='0'){
s.erase(s.begin());
}
if(s.size()==0){//如果是00000
e = 0;
}
if(s[0]=='.'){
s.erase(s.begin());
//找到第一个非0的数
while(s.size()>0&&s[0]=='0'){
e--;
s.erase(s.begin());
}
}
else{
for(auto it=s.begin(); it!=s.end(); it++){
if(*it=='.'){
s.erase(it);
break;
}
e++;
}
}
if(s.size()==0){
e = 0;
}
for(int i=0; i<n; i++){
if(i<s.size()){
ans.push_back(s[i]);
}
else ans.push_back('0');
}
return ans;
}
int main()
{
int n,e1,e2;
string s1,s2;
cin>>n>>s1>>s2;
s1 = solve(s1,e1,n);
s2 = solve(s2,e2,n);
if(s1==s2&&e1==e2){
printf("YES 0.");
cout<<s1<<"*10^"<<e1;
}
else{
printf("NO ");;
cout<<"0."<<s1<<"*10^"<<e1<<" ";
cout<<"0."<<s2<<"*10^"<<e2<<endl;
}
return 0;
}