【ACM】PAT.A1060 Are They Equal 【STL - String】

题目链接
题目分析

麻烦的地方在于:输入的数会有各种格式
1、标准整数 且 截取位数少于两者
2、标准整数 但 截取位数多【补零】
3、小数 且 >1 【找到小数点位数,统计大小】
4、小数 且 <1 【直接跟在小数点后的零需要单独处理 0.00001212】
5、可能有前导零 (000.123123)

解题思路:

先表示成科学计数法,再进行比较


AC程序(C++):
/**************************
*@Author: 3stone
*@ACM: PAT-A1060
*@Time: 18/1/24 & 26
*@IDE: VS2017
***************************/
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>

using namespace std;

// 处理字符串 成 科学计数法
void cleanStr(string &str, int &len, int &point) {
    //消去前导0 (eg 000.122344)
    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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值