题目链接:点击打开链接
题目大意:将两个 float 型数据使用科学计数法表示,并比较两者是否相同。
解题思路:主要比较【有效数字】和【指数】是否相同即可。要考虑所给输入数据的多种情况,比如 0 , 0.0,0.0123,05.032,00.020等这种比较特殊的情况。。
AC 代码
#include<bits/stdc++.h>
#include<cmath>
#define mem(a,b) memset(a,b,sizeof a);
#define INF 0x3f3f3f3f
#define MOD 1000000007
using namespace std;
typedef long long ll;
string s1,s2,nums[2];
int n,es[2];
void fun(string s,int id)
{
int len=s.length(), i=0, l, r;
while(s[i]=='0') i++;
l=i;
if(s[i]=='.') // 0.#
{
i++;
while(s[i]=='0') i++;
r=i-1;
es[id]=i==len?0:l-r; // 0.0 的情况
l=i;
}
else // #.#
{
while(s[i]!='.' && i<len) i++;
r=i;
es[id]=r-l;
}
int cnt=0;
for(int j=l;cnt<n;j++)
{
if(j>=len) nums[id].append(1,'0'), cnt++; // 不足末尾补 0
if(isdigit(s[j]))
{
nums[id].append(1,s[j]);
cnt++;
}
}
}
int main()
{
while(cin>>n>>s1>>s2)
{
fun(s1,0); fun(s2,1);
if(es[0]==es[1] && nums[0]==nums[1]) printf("YES 0.%s*10^%d\n",nums[0].c_str(),es[0]);
else printf("NO 0.%s*10^%d 0.%s*10^%d\n",nums[0].c_str(),es[0],nums[1].c_str(),es[1]);
}
return 0;
}
/* 特殊样例
3 0.001234 1.234
3 0 0.0
*/