题意:
输入一个正整数N(<=100),接着输入两个浮点数(可能包含前导零,对于PAT已经习惯以string输入了,这点未知),在保留N位有效数字的同时判断两个数是否相等,并以科学计数法输出。
trick:
测试点3含有有效数字在小数点以后的数据,此时指数应该是小数点位置减有效数字位置再加上1。
AAAAAccepted code:
1 #define HAVE_STRUCT_TIMESPEC 2 #include<bits/stdc++.h> 3 using namespace std; 4 string a,b; 5 int ans_a[107],ans_b[107]; 6 int main(){ 7 ios::sync_with_stdio(false); 8 cin.tie(NULL); 9 cout.tie(NULL); 10 int n; 11 cin>>n; 12 cin>>a>>b; 13 int cnt=0; 14 int posa=a.size(); 15 int posb=b.size(); 16 int staa=a.size(); 17 int stab=b.size(); 18 for(int i=0;i<a.size();++i)if(a[i]=='.'){ 19 posa=i; 20 break; 21 } 22 for(int i=0;i<b.size();++i)if(b[i]=='.'){ 23 posb=i; 24 break; 25 } 26 for(int i=0;i<a.size();++i)if(a[i]!='0'&&a[i]!='.'){ 27 staa=i; 28 break; 29 } 30 for(int i=0;i<b.size();++i)if(b[i]!='0'&&b[i]!='.'){ 31 stab=i; 32 break; 33 } 34 for(int i=staa;i<a.size();++i){ 35 if(a[i]=='.') 36 continue; 37 if(cnt<n) 38 ans_a[++cnt]=a[i]-'0'; 39 } 40 for(int i=cnt+1;i<=n;++i) 41 ans_a[i]=0; 42 int tot=0; 43 for(int i=stab;i<b.size();++i){ 44 if(b[i]=='.') 45 continue; 46 if(tot<n) 47 ans_b[++tot]=b[i]-'0'; 48 } 49 for(int i=tot+1;i<=n;++i) 50 ans_b[i]=0; 51 int flag=0; 52 for(int i=1;i<=n;++i)if(ans_a[i]!=ans_b[i]) 53 flag=1; 54 if(!flag&&posa-staa==posb-stab||staa==a.size()&&stab==b.size()) 55 cout<<"YES "; 56 else 57 cout<<"NO "; 58 cout<<"0."; 59 for(int i=1;i<=n;++i) 60 cout<<ans_a[i]; 61 int ans=0; 62 if(posa-staa<0) 63 ans=posa-staa+1; 64 else 65 ans=posa-staa; 66 if(staa==a.size()) 67 ans=0; 68 cout<<"*10^"<<ans; 69 if((flag||posa-staa!=posb-stab)&&(staa!=a.size()||stab!=b.size())){ 70 cout<<" 0."; 71 for(int i=1;i<=n;++i) 72 cout<<ans_b[i]; 73 int anss=0; 74 if(posa-staa<0) 75 anss=posb-stab+1; 76 else 77 anss=posb-stab; 78 if(stab==b.size()) 79 anss=0; 80 cout<<"*10^"<<anss; 81 } 82 return 0; 83 }