[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

全部评论
给个nowcoder没有的样例 PAT  样例2: 2   01.01   1.01    输出:Yes 0.10*10^1
点赞 回复 分享
发布于 2018-03-17 21:30

相关推荐

OffersGettttt:为啥现在看到大多数公司都有提前实习的要求
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务