hdu_2054 (A==B?)
2012-07-28 12:34
302 查看
以前做这道题目做不出来,现在大一暑期放假。想到好久没做 Acm 了,而且这段时间在用 java 学习 Android,发现对 C++ 有些淡忘了,于是登上学校 acm 网站找了两道题目做了下。
这道题目还是比较复杂,考虑的情况很多,所以很容易就糊涂了。起先我也找不到很好的方法来解这道题目,后来想了想,发现用stl的栈很容易整理思路解题。
实现思路:
1.判断第一个字符是否为符号 '-' 或 '+' 如果是,压入栈中,如果不是,压人默认符号 '+' 。
2.判断字符是否为 '0' 如果是直接跳过,执行下一字符。
3.如果是 '1'~'9' 的数字,直接压入栈中,并对之后的字符不在做判断,直接入栈。
4.如果遇到 '.' 标记 havePoint 为 true;
5.全部入栈以后,判断 havePoint 是否为 true; 如果是判断 top() 是否返回 '0' 或 '.' ,是则弹出 pop(); 直到遇到非 '0' 或 弹出 '.' 结束;
6.最后就是比较两个数字,通过,弹出栈顶数字比较,遇到不同就判断 NO 直到栈空 则为YES;
给出几个实例如:
0000.1 0.1000000
则栈中分别为 +.1 和 +.1 相等;
-00000001.1000 1.1
则栈中分别为 -1.1 和 +1.1 不相等;
最后还有个特殊要另行判断
+0 -0
栈中分别为 + 和 - 判断为不相等,但实际是相等,所以判断时先判断 size() 是否为 1 是则直接判断相等;
附上ac代码:
这道题目还是比较复杂,考虑的情况很多,所以很容易就糊涂了。起先我也找不到很好的方法来解这道题目,后来想了想,发现用stl的栈很容易整理思路解题。
实现思路:
1.判断第一个字符是否为符号 '-' 或 '+' 如果是,压入栈中,如果不是,压人默认符号 '+' 。
2.判断字符是否为 '0' 如果是直接跳过,执行下一字符。
3.如果是 '1'~'9' 的数字,直接压入栈中,并对之后的字符不在做判断,直接入栈。
4.如果遇到 '.' 标记 havePoint 为 true;
5.全部入栈以后,判断 havePoint 是否为 true; 如果是判断 top() 是否返回 '0' 或 '.' ,是则弹出 pop(); 直到遇到非 '0' 或 弹出 '.' 结束;
6.最后就是比较两个数字,通过,弹出栈顶数字比较,遇到不同就判断 NO 直到栈空 则为YES;
给出几个实例如:
0000.1 0.1000000
则栈中分别为 +.1 和 +.1 相等;
-00000001.1000 1.1
则栈中分别为 -1.1 和 +1.1 不相等;
最后还有个特殊要另行判断
+0 -0
栈中分别为 + 和 - 判断为不相等,但实际是相等,所以判断时先判断 size() 是否为 1 是则直接判断相等;
附上ac代码:
#include<iostream> #include<stack> using namespace std; void toObject (char* srcInteger, stack<char>& out) { bool havePoint = false; for (int i = 0; i < strlen(srcInteger); i++) { if (srcInteger[i] == '-') //判断符号 { out.push('-'); continue; } else if (srcInteger[i] != '+' && out.empty()) //默认为 '+' { out.push('+'); } if (srcInteger[i] == '0' && out.size() == 1) //如果栈中只有符号 且当先字符为 '0' 跳过 { continue; } else { out.push(srcInteger[i]); } if (srcInteger[i] == '.') // 如果遇到 '.' 标记havePoint 为 true { havePoint = true; } } if(havePoint) // 如果栈中有 '.' 需要处理末尾数字 { while(out.top() == '0') //是 '0' 则弹出 { out.pop(); } if (out.top() == '.') // 如果是 '.' 弹出并退出 { out.pop(); } } } int main() { char strA[100000]; char strB[100000]; while(cin>>strA>>strB) { stack<char> objectA; stack<char> objectB; bool equal = false; toObject(strA, objectA); toObject(strB, objectB); if(objectA.size() == objectB.size()) //如果长度不等无需判断 { if (objectA.size() == 1) // 处理 +0 -0 的特殊情况 { equal = true; } else { while(objectA.size() > 0) { if (objectA.top () != objectB.top() ) // 如果不等 退出循环 { break; } objectA.pop(); //相等则弹出栈顶元素 objectB.pop(); } if (objectA.size() == 0) // 最后如果栈空 则判断相等 { equal = true; } } } if (equal) { cout << "YES" << endl; } else { cout << "NO" << endl; } } return 0; }
相关文章推荐
- HDU 2054 又见GCD
- HDU 2054 A == B ?
- HDU-2054A == B ?
- hdu 2054
- hdu 2054
- hdu-2054 A == B ?
- HDU 2054 A == B ?
- HDU 2054 A == B ?(Java大数用equal???C模拟也不能错过)
- E - A == B ? HDU - 2054
- HDU 2054 A == B ?
- hdu---2054A == B ?
- hdu 2054 A==B?
- HDU 2054 A == B?
- HDU 2054 A==B?题解
- hdu 2054 A == B ? (java)
- hdu 2054 A == B ?
- hdu 2054 A==B?
- HDU_1055 && POJ_2054 Color a Tree(贪心)
- HDU-2054-A == B ?
- HDU 2054 A==B?