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