PAT-A1060.Are They Equal

思路:
1、先表示成科学计数法,再进行比较
2、分为 > 1 和 < 1 分类处理

/**************************
//@Author: 3stone
//@ACM: PAT-A1060
//@Time: 18/1/24
//@IDE: VS2017
***************************/
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>

using namespace std;

// 处理字符串
void cleanStr(string &str, int &len, int &point) {
    //消去前导0
    while (str[0] == '0' && str[1] != '.') { 
        str.erase(0, 1);
        len--; point--;
    }
    if (str[0] == '0') { // < 1 (纯小数)
        point = 0;
        if (str != "0") {
            while (str[2] == '0') {
                str.erase(2, 1);//移除小数点后多余0
                point--;
                len--;
            }
            str.erase(0, 2);//只保留小数部分
            len -= 2;
        }
        if (str == "") { str = "0"; point = 0; } // 可能有 0.000 这种
    }
    else { // > 1
        str.erase(point, 1);
        len--;
    }
}

int main() {

    int n;
    string str1, str2;
    cin >> n;
    cin >> str1 >> str2;
    int len1 = str1.size();
    int len2 = str2.size();
    int point_1 = str1.find(".");//小数点的位置,即整数部分的位数
    int point_2 = str2.find(".");
    if (point_1 == string::npos) point_1 = len1;
    if (point_2 == string::npos) point_2 = len2;

    //处理字符串
    cleanStr(str1, len1, point_1);
    cleanStr(str2, len2, point_2);

    //要考虑到 有效位 比 n 小的情况,补0
    while (len1 < n) { str1 += '0'; len1++; }
    while (len2 < n) { str2 += '0'; len2++; }
    //截取所需有效位
    string temp_1 = str1.substr(0, n);
    string temp_2 = str2.substr(0, n);
    //判 等
    bool equalOrNot = true;
    if (temp_1 != temp_2 || point_1 != point_2) equalOrNot = false;
    //输出
    if (equalOrNot)
        cout << "YES 0." << temp_1 << "*10^" << point_1 << endl;
    else
        cout << "NO 0." << temp_1 << "*10^" << point_1 << " 0." << temp_2 << "*10^" << point_2 << endl;

    system("pause");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_26398495/article/details/79169763