PATA1060_测试点3_模拟(难度:⭐️⭐️⭐️)

这个题看似不难,但是细节处理还是有点烦的。

注意几个点:

1、首先判断小数点的位置,然后看去掉小数点后,字符串长度是否大于等于n。这里是要分别处理的,如果小于n的话要补0.

2、第一次交测试点3没过

想了一下测试用例:2 0.034 0.03

自己的程序并没有考虑到数字是0.XXX的,所以在方法前面又加了判断是否是小于1的小数。最后就A了。


#include <bits/stdc++.h>
using namespace std;
int n;
string tran(string s) {
    int pos = 0, flag = 1, dig = 1;
    if (s[0] == '0' && s[1] == '.') dig = -1;
    while (s[pos] == '0' || s[pos] == '.') pos++;
    s = s.substr(pos);
    int k = s.find('.');
    if (k == -1) { //没有小数点
        k = s.size();
        flag = 0;
    }
    if (n <= s.size() - flag) {
        string temp = s.substr(0, n + (k < n ? 1 : 0));
        if (temp.find('.') != -1) temp.erase(temp.find('.'), 1);
        s = temp;
    }
    else {
        string temp = s, zr;
        if (flag == 1) temp.erase(k, 1);
        for (int i = 0; i < n - s.size() + flag; i++) zr += '0';
        s = temp + zr;
    }
    if (dig == -1) return "0." + s + "*10^" + to_string(dig * (pos - 2));
    return "0." + s + "*10^" + to_string(k);
}
int main() {
    string s1, s2;
    cin >> n >> s1 >> s2;
    s1 = tran(s1);
    s2 = tran(s2);
    if (s1 == s2) cout << "YES " << s1;
    else cout << "NO " << s1 << " " << s2 << endl;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值