PAT甲级1060

来源:互联网 发布:status monitor软件 编辑:程序博客网 时间:2024/06/05 19:14

1060. Are They Equal (25)

时间限制
50 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue

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.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<string>#include<iostream>#include<algorithm>using namespace std;int decimalLen(string s){int len = 0;for (int i = 0; i < s.size(); i++){if (s[i] != '.'){len++;}elsebreak;}return len;}bool iszero(string s){for (int i = 0; i < s.size(); i++){if (s[i] != '0')return false;}return true;}int main(){int N;cin >> N;string s1, s2;cin >> s1 >> s2;int len1 = decimalLen(s1);int len2 = decimalLen(s2);if(s1.find(".")!=string::npos)s1.erase(s1.find("."), 1);if (s2.find(".") != string::npos)s2.erase(s2.find("."), 1);if (iszero(s1))len1 = 0;if (iszero(s2))len2 = 0;string t1="", t2="";int size1 = s1.size();int size2 = s2.size();for (int i = 0; i < N; i++){if (i < size1)t1 += s1[i];elset1 += "0";if (i < size2)t2 += s2[i];elset2 += "0";}if (t1 == t2&&len1==len2){cout << "YES " << "0." + t1 + "*10^" << len1;}elsecout << "NO " << "0." + t1 + "*10^" << len1 << " 0." + t2 + "*10^" << len2;return 0;}没有考虑小数的情况及前导零的坑*/#include<iostream>#include<string>using namespace std;int n;//有效位数string deal(string s, int &e){int k = 0;//s的下标while (s.length() > 0 && s[0] == '0'){s.erase(s.begin());//去掉s的前导零}if (s[0] == '.')//若去掉前导零后是小数点,则说明s是小于1的小数{s.erase(s.begin());//去掉小数点while (s.length() > 0 && s[0] == '0'){s.erase(s.begin());//去掉小数点后非零位前的所有零e--;//每去掉一个0,指数e减1}}else//若去掉前导零后不是小数点,则找到后面的小数点删除{while (k < s.length() && s[k] != '.') {//寻找小数点k++;e++;//只要不遇到小数点,就让指数e++}if (k < s.length())//while结束后k<s.length(),说明遇到了小数点{s.erase(s.begin() + k);//把小数点删除}}if (s.length() == 0){e = 0;//如果去掉前导零后s的长度变为0,则说明这个数是0}int num = 0;k = 0;string res;while (num < n)//只要精度还没有到n{if (k < s.length())res += s[k++];//只要还有数字,就加到res末尾elseres += '0';//否则res末尾添加0num++;}return res;}int main(){string s1, s2, s3, s4;cin >> n >> s1 >> s2;int e1 = 0, e2 = 0;//e1,e2为s1与s2的指数s3 = deal(s1, e1);s4 = deal(s2, e2);if (s3 == s4&&e1 == e2)//若主体相同且指数相同,则输出"YES"{cout << "YES 0." << s3 << "*10^" << e1 << endl;}else{cout << "NO 0." << s3 << "*10^" << e1 << " 0." << s4 << "*10^" << e2 << endl;}return 0;}

0 0
原创粉丝点击