If a machine can save only 3 significant digits, the float numbers 12300 and 12358.9 are considered equal since they are both saved as 0.123×10?5?? with simple chopping. Now given the number of significant digits on a machine and two float numbers, you are supposed to tell if they are treated equal in that machine.
Each input file contains one test case which gives three numbers N, A and B, where N (<100) is the number of significant digits, and A and B are the two float numbers to be compared. Each float number is non-negative, no greater than 10?100??, and that its total digit number is less than 100.
For each test case, print in a line YES
if the two numbers are treated equal, and then the number in the standard form 0.d[1]...d[N]*10^k
(d[1]
>0 unless the number is 0); or NO
if they are not treated equal, and then the two numbers in their standard form. All the terms must be separated by a space, with no extra space at the end of a line.
Note: Simple chopping is assumed without rounding.
3 12300 12358.9
YES 0.123*10^5
3 120 128
NO 0.120*10^3 0.128*10^3
#include<bits/stdc++.h> using namespace std; int n; string a,b; const int maxn=110; struct bign{ string d; int cnt; }; bign change(string str,int k){ bool flag=false; bign ans; int len=(int)str.size(); int i=0; while(i<len&&str[i]==‘0‘) { i++; } int pos1=-1,pos2=-1; while(i<len){ if(str[i]==‘.‘) pos2=i; else if(str[i]!=‘0‘||flag){ ans.d+=str[i]; if(pos1==-1) pos1=i; flag=true; } i++; } if(i>=len&&pos2==-1) pos2=len; if(pos2>pos1) ans.cnt=pos2-pos1; else ans.cnt=pos2-pos1+1; //cout<<pos1<<endl<<pos2<<endl; int anslen=(int)ans.d.size(); if(anslen>=k) ans.d=ans.d.substr(0,k); else{ int h=k-anslen; while(h--) ans.d+=‘0‘; } if(flag==false) ans.cnt=0; return ans; } bool judge(bign a,bign b){ if(a.d==b.d&&a.cnt==b.cnt) return true; else return false; } void print(bign a){ cout<<" 0."<<a.d<<"*10^"<<a.cnt; } int main(){ cin>>n; cin>>a>>b; bign ansa,ansb; ansa=change(a,n); ansb=change(b,n); bool flag = judge(ansa,ansb); if(flag){ cout<<"YES"; print(ansa); } else{ cout<<"NO"; print(ansa); print(ansb); } return 0; }
原文:https://www.cnblogs.com/moranzju/p/11291008.html