思路
特殊输入有 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;
}