杭电oj HDOJ 2054 A == B ?

杭电oj HDOJ 2054 A == B ?

Problem Description

Give you two numbers A and B, if A is equal to B, you should print “YES”, or print “NO”.

Input

each test case contains two numbers A and B.

Output

for each case, if A is equal to B, you should print “YES”, or print “NO”.

题目大意

比较两个数,A和B是否相等。有些人一看就想用“A == B”一个语句解决,但其实并不是这么简单的,还是有些坑的。经过多次尝试,我终于明白了本道题的考点:***去除小数的无效“后导零”!***如使“0.50500”变成“0.505”、使“5.00”变成“5”。

解题思路

两个字符串变量A,B接收输入的两个数,如是小数,则从其后面开始删除“0”,直到第一个非零数出现位置,如果小数点后全部为零,还要删除小数点。经上述处理后,再判断“A == B”?

有点人可能会有疑问:整数部分的“前导零”不用处理吗?由于本题的考点就是关于“后导零”的,所以测试用例中没有“前导零”的情况,本着“得到AC”的目的,这里也就不再讨论处理“前导零”的思路了!

本人的C++解决方案

#include <iostream>
#include <string>
using namespace std;

string erase_zero(string str);

int main()
{
    string A, B;
    while (cin>>A>>B) {
        if (erase_zero(A) == erase_zero(B)) {
            cout<<"YES";
        } else {
            cout<<"NO";
        }
        cout<<endl;
    }
    return 0;
}

string erase_zero(string str)
{
    int i, pos, len;
    pos = str.find(".");
    // 先判断是否为小数
    if (pos != string::npos) {
        len = str.length();
        // 找到“后导零”的开始位置
        for (i = len - 1; str[i] == '0'; i--) { }
        if (i == pos) {
        	// 如果小数点后全部为零,还要删除小数点
            str.erase(i, len - i);
        } else {
        	// 删除“后导零”
            str.erase(i + 1, len - i - 1);
        }
    }
    return str;
}

本题涉及到的关于“处理字符串”的内容:

  1. 首先要引用相关头文件:#include <string>
  2. string.find(str):用于“查找字符串”,“str”为所寻找字符串的内容,返回值为其在字符串中的位置。
  3. string.length():用于“测量字符串的长度”,无参数,返回字符串的长度。
  4. string.erase(pos, n):用于“删除字符串中的部分内容”,“pos”为删除部分的起始位置,“n”为删除部分的长度,返回删除后的变量引用。

上述相关函数还有许多其他用法,请读者自行寻找查阅。

代码通过HDOJ平台运行通过检查,如发现错误,欢迎指出和纠正,谢谢!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值