PAT 1020Are They Equal (25)

来源:互联网 发布:南泥湾种鸦片 知乎 编辑:程序博客网 时间:2024/06/01 07:30

思路

特殊输入有 0.000 0.0123 123.02 123402

  • 1.找到小数点’.’的位置,小数点’.’是第几个就代表指数项e是几,除了俩种情况即无小数点123402(返回-1)和<1的数
  • 2.对于无小数点的,e就等于它的长度,对于<1的数,要数除去小数点后有几个0,然后就减去几(例如0.0123 = 1 - 2 =-1,即表示为0.123时指数为-1),再对于0.000 这种情况,直接令其指数为0即可。
  • 3.以上步骤已经得到指数项e,接下来求base,即先去除小数点,如果length小于n则补零,否则从a中取第i个就可以了。
  • 4.最后在比较e和base,如果都相等则相等。

我出错的一些点

  • 1.这个以前没用过int pos = a.find('.');
  • 2.这里以前也没用过a = a.erase(pos, 1);
  • 3.忘记输入为0.000这种情况。

代码

#include <iostream>#include <string>using namespace std;void find_base_e(string &a,int &e1,string &base1,int n){    //第一步:找到'.'    int pos = a.find('.');    int length = a.length();    //第二步:求得e,分三种情况    if (pos < 0)    {        //第一种        e1 = length;    }    else    {        //第二种        e1 = pos;        a = a.erase(pos, 1);    }    //第三种    length = a.length();    for (int i = 0; i < length; i++)    {        if (a[0] == '0')        {            //针对 0.000这种情况            if ((int)a.size() == 1 && a[0] == '0')            {                e1 = 0;                break;            }            a.erase(0, 1);            e1--;        }        else            break;    }    //第三部:求得base    base1 = ""; length = a.length();    for (int i = 0; i < n; i++)    {        if (i < length)        {            base1 += a[i];        }        else            base1 += '0';    }}int main(){    int n; string a, b;    cin >> n >> a >> b;    string base1, base2; int e1, e2;    find_base_e(a, e1, base1,n);    find_base_e(b, e2, base2, n);    if (base1 == base2&&e1 == e2)    {        cout << "YES " << "0." << base1 << "*10^" << e1 << endl;    }    else    {        cout << "NO ";        cout << "0." << base1 << "*10^" << e1;        cout << " ";        cout << "0." << base2 << "*10^" << e2;        cout << endl;    }    return 0;}
0 0
原创粉丝点击