pat知识点复习--day79

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;
}
View Code
时间才能证明一切,选好了就尽力去做吧!
原文地址:https://www.cnblogs.com/tingxilin/p/12302049.html