【PAT甲级】1061 Dating (20 分)(需注意细节的模拟)

题意:

输入一个正整数N(<=100),接着输入两个浮点数(可能包含前导零,对于PAT已经习惯以string输入了,这点未知),在保留N位有效数字的同时判断两个数是否相等,并以科学计数法输出。

trick:

测试点3含有有效数字在小数点以后的数据,此时指数应该是小数点位置减有效数字位置再加上1。

测试点

代码:

#define HAVE_STRUCT_TIMESPEC
#include<bits/stdc++.h>
using namespace std;
string a,b;
int ans_a[107],ans_b[107];
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n;
cin>>n;
cin>>a>>b;
int cnt=0;
int posa=a.size();
int posb=b.size();
int staa=a.size();
int stab=b.size();
for(int i=0;i<a.size();++i)if(a[i]=='.'){
posa=i;
break;
}
for(int i=0;i<b.size();++i)if(b[i]=='.'){
posb=i;
break;
}
for(int i=0;i<a.size();++i)if(a[i]!='0'&&a[i]!='.'){
staa=i;
break;
}
for(int i=0;i<b.size();++i)if(b[i]!='0'&&b[i]!='.'){
stab=i;
break;
}
//cout<<posa<<" "<<staa<<" "<<posb<<" "<<stab<<"\n";
for(int i=staa;i<a.size();++i){
if(a[i]=='.')
continue;
if(cnt<n)
ans_a[++cnt]=a[i]-'0';
}
for(int i=cnt+1;i<=n;++i)
ans_a[i]=0;
int tot=0;
for(int i=stab;i<b.size();++i){
if(b[i]=='.')
continue;
if(tot<n)
ans_b[++tot]=b[i]-'0';
}
for(int i=tot+1;i<=n;++i)
ans_b[i]=0;
int flag=0;
for(int i=1;i<=n;++i)if(ans_a[i]!=ans_b[i])
flag=1;
if(!flag&&posa-staa==posb-stab||staa==a.size()&&stab==b.size())
cout<<"YES ";
else
cout<<"NO ";
cout<<"0.";
for(int i=1;i<=n;++i)
cout<<ans_a[i];
int ans=0;
if(posa-staa<0)
ans=posa-staa+1;
else
ans=posa-staa;
if(staa==a.size())
ans=0;
cout<<"*10^"<<ans;
if((flag||posa-staa!=posb-stab)&&(staa!=a.size()||stab!=b.size())){
cout<<" 0.";
for(int i=1;i<=n;++i)
cout<<ans_b[i];
int anss=0;
if(posa-staa<0)
anss=posb-stab+1;
else
anss=posb-stab;
if(stab==b.size())
anss=0;
cout<<"*10^"<<anss;
}
return 0;
}

猜你喜欢

转载自www.cnblogs.com/ldudxy/p/11682024.html