hdu 2054-A == B ?
2015-03-22 20:12
211 查看
题目及代码:
以字符串的形式给出A和B,判断A和B的数值是否相等。
没什么事,也就来看看以前没做出来的题目。这是大一的时候留下的题目了,当时怎么做都不对,后来才知道,直接想的太简单了,后来就放弃了。
现在可能这道题目,就知道是一道比较恶心的模拟题目了。
思路就是用两个栈分别来存两个数,当然需要有一下要注意的地方:
1.‘+’和‘-’的处理:如果这个数是第一个字符是‘-’,那么就要压栈‘-’,否则无论这个数的第一个字符是不是‘+’,都要压栈‘+’(这样方便比较);
2.去掉前导0,这里需要注意一下如果是形如‘0000’或者‘0000.0001’的数,这里记得要留一个‘0’压栈(具体处理看代码);
3.后导0的处理,也都要去掉,注意一下形如‘0000.000’的情况,也就是说去掉后导0后还剩下一个‘.’这是我们不想看见的;
4.还有就是-0和+0的比较
#include <iostream>
#include <cstdio>
#include <cstring>
#include <stack>
using namespace std;
char s[111111];
stack<char> l,r;
void solve(char s[],stack<char> &nt)
{
bool flag=false;//记录是否有小数点
char vt;
int len=strlen(s),i=0;
//看正负,压栈'-'或者'+'
if(s[i]=='-')
{
nt.push(s[i]);
i++;
}
else if(s[i]=='+')
{
nt.push(s[i]);
i++;
}
else nt.push('+');
//去掉前导0
for(;i<len-1&&s[i]=='0';i++);
//压栈剩下的数字
for(;i<len;i++)
{
if(s[i]=='.')
{
//防止去掉前导0后出现整数部分不存在的情况
if(nt.top()=='-'||nt.top()=='+') nt.push('0');
flag=true;
}
nt.push(s[i]);
}
if(flag) //存在小数点,那么我们就要进行后导0的去除
while(!nt.empty())
{
vt=nt.top();
if(vt!='0')
{
break;
}
nt.pop();
}
//小数部分为0,去掉'.'
if(vt=='.') nt.pop();
}
int main()
{
while(scanf("%s",s)!=EOF)
{
while(!l.empty())
{
l.pop();
}
while(!r.empty())
{
r.pop();
}
solve(s,l);
scanf("%s",s);
solve(s,r);
bool flag=true,flag_0=true;//flag判断是否两个数相等,flag_0判断是否比较过的数字都是0
while(!l.empty()&&!r.empty())
{
//printf("%c %c\n",l.top(),r.top());
if(l.top()!=r.top())
{
flag=false;
break;
}
if(l.top()!='0') flag_0=false;
l.pop();r.pop();
}
if(!l.empty()||!r.empty())
{
flag=false;
}
if(flag_0&&(l.top()=='-'||l.top()=='+')&&(r.top()=='-'||r.top()=='+'))
{
//如果比较过的数字都是0,并且最后比较的是符号位,那么这两个数都是0
printf("YES\n");
}
else
{
printf("%s\n",flag?"YES":"NO");
}
}
return 0;
}
以字符串的形式给出A和B,判断A和B的数值是否相等。
没什么事,也就来看看以前没做出来的题目。这是大一的时候留下的题目了,当时怎么做都不对,后来才知道,直接想的太简单了,后来就放弃了。
现在可能这道题目,就知道是一道比较恶心的模拟题目了。
思路就是用两个栈分别来存两个数,当然需要有一下要注意的地方:
1.‘+’和‘-’的处理:如果这个数是第一个字符是‘-’,那么就要压栈‘-’,否则无论这个数的第一个字符是不是‘+’,都要压栈‘+’(这样方便比较);
2.去掉前导0,这里需要注意一下如果是形如‘0000’或者‘0000.0001’的数,这里记得要留一个‘0’压栈(具体处理看代码);
3.后导0的处理,也都要去掉,注意一下形如‘0000.000’的情况,也就是说去掉后导0后还剩下一个‘.’这是我们不想看见的;
4.还有就是-0和+0的比较
#include <iostream>
#include <cstdio>
#include <cstring>
#include <stack>
using namespace std;
char s[111111];
stack<char> l,r;
void solve(char s[],stack<char> &nt)
{
bool flag=false;//记录是否有小数点
char vt;
int len=strlen(s),i=0;
//看正负,压栈'-'或者'+'
if(s[i]=='-')
{
nt.push(s[i]);
i++;
}
else if(s[i]=='+')
{
nt.push(s[i]);
i++;
}
else nt.push('+');
//去掉前导0
for(;i<len-1&&s[i]=='0';i++);
//压栈剩下的数字
for(;i<len;i++)
{
if(s[i]=='.')
{
//防止去掉前导0后出现整数部分不存在的情况
if(nt.top()=='-'||nt.top()=='+') nt.push('0');
flag=true;
}
nt.push(s[i]);
}
if(flag) //存在小数点,那么我们就要进行后导0的去除
while(!nt.empty())
{
vt=nt.top();
if(vt!='0')
{
break;
}
nt.pop();
}
//小数部分为0,去掉'.'
if(vt=='.') nt.pop();
}
int main()
{
while(scanf("%s",s)!=EOF)
{
while(!l.empty())
{
l.pop();
}
while(!r.empty())
{
r.pop();
}
solve(s,l);
scanf("%s",s);
solve(s,r);
bool flag=true,flag_0=true;//flag判断是否两个数相等,flag_0判断是否比较过的数字都是0
while(!l.empty()&&!r.empty())
{
//printf("%c %c\n",l.top(),r.top());
if(l.top()!=r.top())
{
flag=false;
break;
}
if(l.top()!='0') flag_0=false;
l.pop();r.pop();
}
if(!l.empty()||!r.empty())
{
flag=false;
}
if(flag_0&&(l.top()=='-'||l.top()=='+')&&(r.top()=='-'||r.top()=='+'))
{
//如果比较过的数字都是0,并且最后比较的是符号位,那么这两个数都是0
printf("YES\n");
}
else
{
printf("%s\n",flag?"YES":"NO");
}
}
return 0;
}
相关文章推荐
- hdu 2054
- HDU 2054 A==B?
- HDU 2054 字符串 比较两个数大小,忽略整数前面的0和小数最后的0
- HDU 2054 A == B?
- hdu 2054 A == B ? (java)
- HDU 2054 A == B ?
- HDU 2053a/b + c/d 2054 又见gcd
- HDU 2054 A==B? 大数
- HDU 2054 A == B ?
- hdu 2054
- HDU 2054
- HDU-2054 A==B?
- hdu 2054 A == B ? (java大数)
- HDU 2054 大数比较
- hdu 2054 (典型字符串模拟)
- hdu 2054 A == B ? (java)
- HDU 2054 A == B ?
- hdu 2054 A == B ?
- 大数--HDU 2054 A==B?(java)
- HDU 2054