PAT A1060(STL string的应用)
这个题的解决要点:
1、首先,有可能存在前导0,全部去掉
2、有小于1的数,在科学计数法中,在小数点后面的0也是要去掉的,同时去掉的时候要考虑对指数的影响(每一个小数点后,第一个非0之前的0都对应e-1)
3、大于1的数中,可能有小数点可能没有,这时候需要找到小数点的位置,如果没有,就是0-len都是指数,如果有,找到位置并记录指数,跳出去掉小数点
4、处理以后的字符串可能会出现精确度不够要后面补0
5、极端情况下,数字就是0,那么需要把指数修正为0
易错点:
1、发现前导零没有消除,是因为‘0’写成了0
2、因为使用了引用,所以这个函数多次调用会导致e多次被修改,在测试的时候不要多次调用函数
3、s并不会被函数修改,需要更新str=str(deal,e),不然输出的过程有问题
4、在不够n后续添0的过程中,不要减少n或者对应temp,不然s在增加temp在减少算了两轮
5、e有可能是负数,把他合并在整个字符串输出有难度,所以输出前面再单独输出e比较好处理
#include<string> #include<iostream> using namespace std; int n; string deal(string s,int &e) { while(s.length()>0 && s[0]=='0') s.erase(s.begin()); if(s[0]=='.') { s.erase(s.begin()); while(s.length()>0 && s[0]=='0') { s.erase(s.begin()); e--; } } else { int temp=0; while(temp<s.length() && s[temp]!='.') { temp++; e++; } if(temp!=s.length()) { s.erase(s.begin()+temp); } } if(s.length()==0) e=0; if(n>=s.length()) { int temp=n; while(temp>s.length()) { s.insert(s.length(),"0"); } } else { s.erase(s.begin()+n,s.end()); } return s; } void shuchu(string s,int e) { string ans="0.*10^"; ans.insert(2,s.substr(0,n)); cout<<ans; cout<<e; } int main() { string str1,str2; bool pd=true; cin>>n; cin>>str1>>str2; int e1=0,e2=0; str1=deal(str1,e1); str2=deal(str2,e2); if(str1!=str2|| e1!=e2) pd=false; if(pd) { cout<<"YES "; shuchu(str1,e1); } else { cout<<"NO "; shuchu(str1,e1); cout<<" "; shuchu(str2,e2); } return 0; }