1060 Are They Equal (25 分)
- 题意:一个机器只能有n位有效位,给出两个浮点数,求出这两个浮点数的科学计数法(保留n位有效数字),并求出这两个数的保留n位有效数字的科学计数表示是否相同。
- 思路:参考《算法笔记》,需要用到STL中的string知识(现在才知道原来string是STL中的,而且string很多语法之前都没有用过)。
- step1:给出的数分两种可能,①0.a1a2a3…②b1b2—bm.a1a2a3…(b1不为零)对这两种输入情况分别进行科学计数就可以了,但需要注意,还有一个潜在的坑:输入可能是0000.123或000123.56,就是说可能会有无效的前导零存在,那么首先在输入时就要去掉无效的前导零。按第一位是否是小数点来判断输入的数属于①还是②。
- step2:对于①来说,把小数点,小数点后的零都删去,只保留第一个有效的数,同时小数点后零的个数即为指数(的相反数)。
- step3:对于②来说,把小数点删去,第一个有效数到小数点前的位数即为指数。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int n;
string s1,s2;
int e1=0,e2=0;
string deal(string s,int &e)
{
int k=0;
while(s[0]=='0'&&s.length()>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
{
while(s.length()>k&&s[k]!='.')
{
k++;
e++;
}
if(k<s.length())
{
s.erase(s.begin()+k);
}
}
if(s.length()==0)
e=0;
int num=0;
k=0;
string res;
while(num<n)
{
if(k<s.length())res+=s[k++];
else res+='0';
num++;
}
return res;
}
int main()
{
string s3,s4;
cin>>n>>s1>>s2;
s3=deal(s1,e1);
s4=deal(s2,e2);
if(s3==s4&&e1==e2)
printf("YES 0.%s*10^%d\n",s3.c_str(),e1);
else
{
printf("NO 0.%s*10^%d 0.%s*10^%d\n",s3.c_str(),e1,s4.c_str(),e2);
}
}