PAT 1020 Are They Equal (25)

思路

特殊输入有 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值