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*105 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.
Input Specification:
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 10100, and that its total digit number is less than 100.
Output Specification:
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.d1...dN*10^k" (d1>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.
Sample Input 1:3 12300 12358.9Sample Output 1:
YES 0.123*10^5Sample Input 2:
3 120 128Sample Output 2:
NO 0.120*10^3 0.128*10^3
#include <iostream> #include <string> #include <cstdio> #include <sstream> using namespace std; //cut or extend to significant string edittosig(string s,int sig) { if(sig > s.size()) { int delta = sig - s.size(); for(int i = 0;i < delta;++ i) s += "0"; } else s = s.substr(0,sig); return s; } //delete useless 0 and add . string standard(string s) { if(s[0] == '.') s = "0" + s; int firstnzero = s.find_first_not_of("0"); if(firstnzero == string::npos) return "0."; //delete pre zero if(s[firstnzero] != '.') s = s.substr(firstnzero); else s = s.substr(firstnzero - 1); // add . if(s.find(".") == string::npos) s = s + "."; //delete post zero s = s.erase(s.find_last_not_of("0") + 1); return s; } //change to scientific notation string normalize(string num,int sig) { num = standard(num); //calculate exponent int exp(0); if(num == "0.") exp = 0; else { int potidx = num.find("."); int nzeroidx = num.find_first_not_of("0."); if(num[0] == '0') exp = potidx - nzeroidx + 1; else exp = potidx - nzeroidx; } if(num.find_first_not_of(".0") == string::npos) num = ""; else num = num.substr(num.find_first_not_of(".0")); if(num.find(".")!=string::npos) num = num.erase(num.find("."),1); //add zero to the last of string or delete reduntant numbers num = edittosig(num,sig); //format string string normalizednum; ostringstream formatstr; formatstr << "0." << num << "*10^" << exp; return formatstr.str(); } int main() { int n; string a,b; cin >> n; cin >> a >> b; string na = normalize(a,n); string nb = normalize(b,n); if(na == nb) cout << "YES " << na; else cout << "NO " << na << " " << nb; }