\quad
这个字符串处理题比较坑,有很多极端情况需要考虑,这里提供一些测试用例。
4 00034.5 0.00345
2 0.0 0.001
1 0.1 1.0
5 0 00.0
\quad
难点在于获取指数以及前面的系数,获取前面的系数需要考虑到两种情况,一种是1.224,这种情况下前3个有效数字组成的系数是0.122,第二种情况是0.01224,这种情况下也为0.122。还需注意若长度不足给定长度需补0.
\quad
第二个难点在于获取指数,也有两种情况,一种是0.001这种,指数为负数,一种是123.12这种,需要分开讨论。
\quad
最后还需注意给定的测试用例中存在前导0这种情况,比如0023.4,我们需要提前去除这些前导0。
include <iostream>
#include <string>
using namespace std;
// 获取长度为len的系数
string getCoef(string s, int len)
{
string res = "";
int cnt = 0;
bool flag = false;
for (int i = 0; i < s.length(); ++i) {
if(s[i]>'0' && s[i]<='9' && cnt<len)
{
res += s[i];
cnt++;
flag = true;
}
if(s[i]=='0' && flag && cnt<len)
{
res += s[i];
cnt++;
}
}
// 长度不够,补0
for (int i = cnt; i < len; ++i) res += '0';
return "0." + res;
}
// 获得指数
int getExp(string s)
{
if(s=="0")
return 0;
int index = s.find('.');
if(index==-1) index = s.length();
if(s.length()>2 && s[0]=='0' && s[1]=='.') //0.01这类指数为为负数
{
for (int i = 2; i < s.length(); ++i) {
if(s[i]!='0') return 2-i;
}
return 0;
}
return index; // 1.23这类指数为index
}
// 按照要求格式输出科学计数法
void output(string s, int len)
{
cout << " " << getCoef(s, len) << "*10^" << getExp(s);
return;
}
int main()
{
int len;
string s1, s2;
cin >> len >> s1 >> s2;
//存在0034.5这样的样例,需提前去除这类0
while(s1!="0" && s1[0]=='0' && s1[1]!='.') s1.erase(s1.begin());
while(s2!="0" && s2[0]=='0' && s2[1]!='.') s2.erase(s2.begin());
if(getCoef(s1, len)==getCoef(s2, len) && getExp(s1)==getExp(s2))
{
cout << "YES";
output(s1, len);
} else
{
cout << "NO";
output(s1, len);
output(s2, len);
}
return 0;
}