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;
}