[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