算法C++ 【字符串】A == B ?

Time Limit: 1 Sec   Memory Limit: 64 MB
Submit: 3333   Solved: 94
[ Submit][ Status][ Web Board]

Description

给定两个数A和B(长度不超过100),如果它们相等则输出"YES",否则输出"NO"。

Input

每组测试数据包含两个数A和B。

Output

对于每组测试数据,如果A和B相等,则输出"YES",否则输出"NO"。

Sample Input

1 22.6 2.63 34 3

Sample Output

NOYESYESNO

HINT

Source

//今天我有空就做了这道ACM算法题。不是最好的,但是可以参考参考。有更好的欢迎贴出来给我学习下
#include<iostream>
#include<string>
using namespace std;

bool equal(string a, string b)
{
	string::iterator aItr=a.begin(), bItr=b.begin();
	bool point = false;//是否有小数点
	bool aPL = true, bPL = true;//true为正号,false为负号
	bool Zero = true;//判断两数是否均为0

	//【step1:判断正负号】
	if(*a.begin() == '-') //如果a数前面是负号
	{
		aPL = false; 
		++aItr; //继续往后看
	}else if(*a.begin() == '+')//如果a数前面是正号
		++aItr; //继续往后看

	if(*b.begin() == '-')  //如果b数前面是负号
	{
		bPL = false;
		++bItr;//继续往后看
	}else if(*b.begin() == '+')//如果b数前面是正号
		++bItr;//继续往后看

	//【step2:判断前面是否有0,有0就跳过它们】
	while(aItr != a.end() && *aItr == '0') 
		++aItr;
	while(bItr != b.end() && *bItr == '0')
		++bItr;

	//【step3:比较对应位数上的字符是否一样,一直移动到字符不同的位数或至少一位到达末尾】
	while(aItr != a.end() && bItr != b.end() && *aItr == *bItr)
	{
		//如果发现某位数上不是“0”或者不是“.”就让Zero为false
		if( (*aItr != '0' && *aItr != '.') || (*bItr != '0' && *bItr != '.'))
			Zero = false;

		//如果某位上都有“.”则这两个数都为小数
		if(*aItr == '.')
			point = true;

		//继续往后看
		++aItr;
		++bItr;
	}

	//【step4:判断有没有其中一位到了末尾,而另一位遇到小数点的情况】
	//如果b已经到末尾,而a指向的为小数点,则让a前进一位
	if(aItr != a.end() && *aItr == '.')
	{
		point = true;
		++aItr;
	}

	//如果a已经到末尾,而b指向的为小数点,则让b前进一位
	if(bItr != b.end() && *bItr == '.')
	{
		point = true;
		++bItr;
	}

	//如果其中一位是小数,且它的下一位是0,可以它可以继续前进
	if(point)
	{
		while(aItr != a.end() && *aItr == '0')
			++aItr;
		while(bItr != b.end() && *bItr == '0')
			++bItr;
	}

	//【step5:判断是否为0。如果指向的是字符不同的位数而不是均指向末尾,说明它们不是均为0。】
	//比如判断 0 和 1,因为Zero默认为true,
	//所以这时如果不说明它们不是均为0的话,下面的判断步骤二就会误判
	if ((aItr != a.end() && *aItr != '0') || (bItr != b.end() && *bItr != '0') )
	{
		Zero = false;
	}

	//【step6:判断结果】
	//如果两数都到末尾,且符号一致,说明它们相等
	if(aItr == a.end() && bItr == b.end() && aPL == bPL)
		return true;
	//如果两数均为0,说明它们相等。比如 -0 和 0它们的符号不同,不能通过上面的方法判断
	if(Zero)
		return true;
	return false;
}

int main()
{
	string a,b;
	while(cin >> a >> b)
	{
		if(equal(a,b))
			cout << "YES" << endl;
		else
			cout << "NO" << endl;
	}
	return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值