就头铁,硬钢这道题,一个半小时才ac。
遇到的问题:
1用string解决,用小数点和第一个非0位的距离来判定科学计数法的次幂。
2用浮点数处理加to_string好像可以,但是我出了好多bug,用浮点数处理这个题也许行,但是有0.000好多的情况出现,我尝试了一下,就过了一个点。。
3遇到问题对输入数纯0的数要进行特判,否则代码不严谨可能越界。
ac代码(太乱了):
#include<stdio.h>
#include<iostream>
#include<string>
using namespace std;
string test(string a,int &e,int n)
{
string atr;//存放新的string
int i = 0;//遍历a,b的下标
int s;//记录第一位不为0的位置
while (a[i] == '0') i++;//x消除0
if (a[i] == '.')//若为小数,开始记录e
{
i++;
while (a[i] == '0')
{
i++;
e--;
}
s = i;
}
else {
s = i;
while (a[i] != '.'&&i < a.length())
{
e++;
i++;
}
}
for (int j = 0; j < n; j++)
{
if (a[s + j] == '.')s++;
if (s + j >= a.length())
{
atr.insert(j, "0");
}
else
atr.insert(atr.begin() + j, a.begin() + s + j, a.begin() + s + j + 1);
}
return atr;
}
int main()
{
int n;//输入n
string a, b;//输入ab
bool flag=false;
cin >> n;
cin >> a >> b;
int e1 = 0;//科学计数的10次幂数
int e2 = 0;//科学计数的10次幂数
string atr, btr;
atr = test(a, e1, n);
btr = test(b, e2, n);
for (int i = 0; i < n; i++)
{
if (atr[i] != btr[i])
{
flag = true;
}
}
if (flag == true)
{
cout << "NO 0."<< atr << "*10^"<< e1<< " 0." << btr << "*10^"<< e2;
}
else
{
cout << "YES 0." << atr << "*10^" << e1;
}
return 0;
}