[PAT解题报告] Are They Equal
给定两个非负实数,用类似于科学记数法的形式表示为0.xxxxx * 10 ^ k的形式,小数点第一位非0
(当然原数为0除外),保留小数直接截断或者补0,不需要四舍五入,问处理之后它们是否相等。
分析: 其实题目说的还不是很清晰,比如原数为0的时候,指数k应该为多少,我理解是0.0 * 10 ^
1这样,所以这种情况我把k处理为1了,也不知道有没有这样的case。因为数字有100位,我们需要用字符串读入,对字符串处理。
首先对于整数部分,我们需要移动指数k,整数有多少位,k就要变成负几,当然首0要考虑,小数部分的首0也一样,所以k要不注意+1或者-1,小心处理一下,最后标准化之后,就是0.xxx
* 10 ^ k了,然后还要注意如果小数位数不够(有效数字),要补0,而太长直接截断就好(substr)。
把两个数都标准化之后,直接用字符串比较它们是否相同就可以了。
所以本题本质是个标准化的过程……
代码:
#include <cstdio>
#include <cstring>
#include <string>
#include <sstream>
using namespace std;
string standard(char *s,int n) {
int k = 0;
string answer;
bool mark = false;
for (int i = 0; s[i]; ++i) {
if (s[i] == '.') {
mark = true;
}
else {
if (!mark) {
++k;
}
if ((answer == "") && (s[i] == '0')) {
--k;
}
else {
answer += s[i];
}
}
}
while (answer.size() < n) {
answer += '0';
}
if (answer.size() > n) {
answer = answer.substr(0, n);
}
mark = true;
for (int i = 0; i < n; ++i) {
if (answer[i] != '0') {
mark = false;
}
}
if (mark) {
k = 0;
}
ostringstream out;
out<<"0."<<answer<<"*10^"<<k;
return out.str();
}
int main() {
int n;
char s[205];
scanf("%d%s",&n,s);
string a = standard(s, n);
scanf("%s",s);
string b = standard(s,n);
if (a == b) {
printf("YES %s\n",a.c_str());
}
else {
printf("NO %s %s\n",a.c_str(),b.c_str());
}
return 0;
}
http://www.patest.cn/contests/pat-a-practise/1060



