PAT 1060. Are They Equal (25)

1060. Are They Equal (25)

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

 需要注意的是的情况为0.00, 0012.3 0.00123等等

 1 #include <iostream>
 2 #include <string>
 3 
 4 using namespace std;
 5 
 6 int CalculateRadix(string &num)
 7 {
 8     int i = 0;
 9     while (i < num.size())
10     {
11         if (num[i] == '.')
12         {
13             num.erase(i, 1);
14             break;
15         }
16         i++;
17     }
18 
19     return i;
20 }
21 
22 int erasezero(string &num)
23 {
24     int cnt = 0;
25     string::iterator it = num.begin();
26     while (it!=num.end()&& (*it) == '0')
27     {
28         it = num.erase(it);
29         cnt++;
30     }
31     return cnt;
32 }
33 
34 string CalculateCoeff(string num, int significantNum, int &radix)
35 {
36     string coeff;
37     radix -= erasezero(num);
38     if (num.empty())
39         radix = 0;
40     if (num.size() >= significantNum)
41         coeff.assign(num.begin(), num.begin() + significantNum);
42     else
43         coeff = num + string(significantNum - num.size(), '0');
44 
45     return "0." + coeff;
46 }
47 
48 int main()
49 {
50     string num1, num2;
51     int significantNum;
52     cin >> significantNum >> num1 >> num2;
53 
54     int radix1, radix2;
55     radix1 = CalculateRadix(num1);
56     radix2 = CalculateRadix(num2);
57     
58     string coeff1 = CalculateCoeff(num1, significantNum, radix1);
59     string coeff2 = CalculateCoeff(num2, significantNum, radix2);
60 
61     if (coeff1 == coeff2&&radix1 == radix2)
62         cout << "YES" << " " << coeff1 << "*10^" << radix1;
63     else
64         cout << "NO" << " " << coeff1 << "*10^" << radix1 << " " << coeff2 << "*10^" << radix2;
65 }

 

转载于:https://www.cnblogs.com/jackwang822/p/4726875.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值