PAT A1060 Are They Equal (25)----string经典例题(重点复习)

总结:

1.对于这类题,首先要弄清楚题意,找到一个合适的方法才会事半功倍,否则就会像我第一次写了一百多行代码发现只过了3个测试点,还有这类问题思考问题一定要全面,否则很容易出错

2.这道题的坑主要是在:0.00000123,000123,000.0000,0000这几个数据上,去除第一位位0但是第二位不为小数点的0

然后分0.12345(小数部分为0)和123.12344(都不为0)和1234(没有小数部分)讨论

3.多多重复---%¥#@

1060 Are They Equal (25)(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*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<iostream>
#include<string>
using namespace std;
int a1 = 0;
int n;
string opp(string s)
{
    //获取整数部分和小数部分
    int k = s.find('.');
    if (k == string::npos){          //没有小数部分
        a1 = s.length();
        if (s.length() > n)s.erase(n, s.length() - n);
        else if (s.length() < n){ string sp(n - s.length(), '0'); s += sp; }
        s = "0." + s;
    }
    else{                                //有小数部分和整数部分
        if (s[0] == '0'){
            int ft = 2; int ci = 0;
            for (int i = 2; i < s.length(); i++)
            {
                if (s[i] == '0')ci--;
                else break;
            }
            if (-ci == s.length() - 2)ci = 0;
            else
            a1 = ci;
            s = s.substr(2 - ci, s.length() - 2 + ci);
            if (s.length()>n){ s.erase(n, s.length() - n); s = "0." + s; }
            else if (s.length() <= n){
                string sp(n - s.length(), '0'); s += sp;
                s = "0." + s;
            }
        }
        else{
            a1 = k; s.erase(k, 1);
            if (s.length()>n)s.erase(n, s.length() - n);
            else if (s.length() < n){
                string sp(n - s.length(), '0'); s += sp;
            }
            s = "0." + s;
        }
    }
    return s;
}
int main()
{
    string s1, s2;
    cin >> n >> s1 >> s2;
        while (s1[0] == '0'&&s1[1]!='.')s1.erase(0,1);
        while (s2[0] == '0'&&s2[1]!='.')s2.erase(0, 1);
    s1 = opp(s1); string sp1 = "*10^"; string sp2 = to_string(a1);
    s2 = opp(s2); string sp3 = to_string(a1);
    
    int flag = 1;
    for (int i = 0; i < s1.length();i++)
    {
        if (s1[i] != s2[i]){ flag = 0; break; }
    }
    if (flag == 0||sp2!=sp3){ printf("NO "); cout << s1 + sp1 + sp2 << " " << s2 + sp1 + sp3; }
    else{
        printf("YES "); cout << s1 + sp1 + sp2;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值