其他分享
首页 > 其他分享> > PAT【甲级】1160

PAT【甲级】1160

作者:互联网

题目链接:PAT【甲级】1160
题目简述::给出两个数,问将它们写成保留N位小数的科学计数法后是否相等。如果相等,输出YES, 输出他们的科学记数法表示方法。如果不相等输出NO,分别输出他们的科学计数表示。

#include<bits/stdc++.h>
using namespace std;

string factory(string s, int n){
    int pos = 0;
    while(pos < s.size() && s[pos] != '.') pos++;//找出小数点的位置
    if(pos < s.size()) s.erase(pos, 1);//删除小数点,剩下纯数字【特别注意,erase的用法】
    for (int i = 0; i < s.size();i++){
        if(s[i] == '0'){//消除前导0
            s.erase(i, 1);
            i--;
            pos--;//指数会对应减1
        }else
            break;
    }
    if(s.size() == 0) //这是特殊情况。如果原来的这个数字是0.0的话,那么指数就是0了,而不应该是-1。
        pos = 0;
    string ans = "0." + s.substr(0, n);//在消除前导0的串中截取精度长度的数字串
    for (int i = ans.size(); i < n + 2;i++)//如果不够,那就补齐精度
        ans += '0';
    ans += "*10^" + to_string(pos);//整合成答案串
    return ans;
}

int main(){
    int n;
    string a, b, ans1, ans2;
    cin >> n >> a >> b;
    ans1 = factory(a, n);
    ans2 = factory(b, n);
    if(ans1 == ans2)
        cout << "YES " << ans1 << endl;
    else
        cout << "NO " << ans1 << " " << ans2 << endl;
    return 0;
}

关键是个整体的思想。我开始并不是这么想的,第一次只拿了两个测试点,微调之后拿了5个。所以可以看出我的想法是不正确的,就仔细想了一下,以整体观来解决问题,于是便有了上面的代码。

可惜的是,最后一个测试点没过。经过很长时间的查找,终于发现原来是0.0这个边界出现的问题。

标签:PAT,string,int,pos,甲级,erase,ans,1160,size
来源: https://blog.csdn.net/qq_41375322/article/details/116592813