PAT.A1060 Are They Equal

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.

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 10^100^, 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.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.

Sample Input 1:

3 12300 12358.9

Sample Output 1:

YES 0.123*10^5

Sample Input 2:

3 120 128

Sample Output 2:

NO 0.120*10^3 0.128*10^3
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
#include<iostream>
#include<string>
#include<set>
using namespace std;
string change(string s,int n) {
	int k = s.find(".");
	if (k == string::npos) {
		int i = 0,l;
		while(s[i]=='0'){
			i++;
		}
		s = s.substr(i, s.length() - i);
		l = s.length();
		if (l >= n) {
			s = "0." + s.substr(0, n) + "*10^" + to_string(l);
		}
		else {
			s = "0." + s;
			int p = n - l;
			while (p--) {
				s += "0";
			}
			s=s+ "*10^" + to_string(l);
		}
		return s;
	}
	else {
		int i = 0;
		while (s[i] == '0') {
			i++;
		}
		s = s.substr(i, s.length() - i);
		int j = 0;
		while (s[j] != '.') j++;
		if (j > 0) {
			s.erase(s.begin() + j);
			int l = s.length() ;
			if (l >= n) {
				s = "0." + s.substr(0, n) + "*10^" + to_string(j);
			}
			else {
				int p = n - l;
				s = "0." + s;
				while (p--) {
					s += "0";
				}
				s += "*10^" + to_string(j);
			}
		}
		else {
			s.erase(s.begin());
			int l = s.length();
			int i = 0;
			while (s[i] == '0') i++;
			s = s.substr(i, l - i);
			//cout << s.empty() << "\n";
			if (i > 0) {
				string s1;
				if (s.empty()) s1 = "0";
				else s1 = "-"+to_string(i);
				if (s.length() >= n) {
					s = "0." + s.substr(0, n) + "*10^" + s1;
				}
				else {
					int p = n - s.length();
					s = "0." + s;
					while (p--) {
						s += "0";
					}
					s += "*10^" + s1;
				}
			}
			else {
				if (s.length() >= n) {
					s = "0." + s.substr(0, n) + "*10^0";
				}
				else {
					int p = n - s.length();
					s = "0." + s;
					while (p--) s += "0";
					s += "*10^0";
					
				}
				
			}
		}
		return s;

	}
}
int main() {
	int n;
	cin >> n;
	string a1, a2;
	cin >> a1>>a2 ;
	if (change(a1, n) == change(a2, n))
		cout << "YES " << change(a1, n);
	else
		cout << "NO " << change(a1, n) << " " << change(a2, n);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/mokena1/article/details/80863462