您的位置:首页 > 编程语言

华为编程大赛--判断给定数是否满足给定条件要求

2014-03-23 19:58 295 查看
第一次参加华为编程大赛的最后一题,现在回过来看了一下,发现要做完要3个多小时,比赛时间才3小时,还是要加紧练习。另外,答案也不知道是不是所有用例都能测试通过,就是捣腾了一下。。。。见笑。

2.3 题目:判断给定数是否满足给定条件要求
2.3.1 题目描述:
说明:

1、 条件是一个字符串,其格式由数学上的“开闭区间”,"&&"和"||"组成。其格式为:[5,7]&&(6,9]||(10,20),该条件表示“大于等于5,小于等于7”并且“大于6,小于9”或者“大于10,小于20”。

2、 &&优先级高于||。
2.3.2 输入:
1、 字符串1:上述描述格式的条件:如[5,7]&&(6,9]||(10,20)

2、 数字:判断是否满足条件的数字:9

说明:上诉两个参数是在一行中输入的,其格式为:字符串1+空格+数字。如[1,2]||(3,4) 3
2.3.3 输出:
如果满足条件,则输出1,否则0。
2.3.4 样例输入:
[1,2]||(3,4] 3
2.3.5 样例输出:
0
代码:

#include <cstdio>
#include <stack>
#include <cstdlib>
#include <ctype.h>
using namespace std;
#define MAXN 100

stack<char> s;
stack<char> v;

int main()
{
//freopen("in.txt","r",stdin);
char buf[MAXN];
char num[32],ch[32],a;
memset(num,32*sizeof(char),'0');
int b,flag;
int i,j,ok,value;
while(2 == scanf("%s%s",&buf,&ch))
{
sscanf(ch,"%d",&value);
for(i=0;i<=strlen(buf);i++)
{
if( (i<strlen(buf)) ? (buf[i] != '|') : (i != strlen(buf)) )
{
if(isdigit(buf[i]) || buf[i] == ',')
v.push(buf[i]);
else if(buf[i] == '&')
{
v.push(',');

i++;
}
else
s.push(buf[i]);

//printf("%c\n",s.top());
}
else
{
i++;
while(!s.empty() && !v.empty())
{
j=31;
while(!v.empty() && v.top() != ',')
{
num[j--] = v.top();
v.pop();
}
if(!v.empty() && v.top() == ',')
v.pop();
sscanf(num,"%d",&b);

a = s.top();
s.pop();
ok = 1;
if(a == ']')
{
if(value > b)
{
ok = 0;
break;
}

}
else if(a == ')')
{
if(value >= b)
{
ok = 0;
break;
}

}
else if(a == '[')
{
if(value < b)
{
ok = 0;
break;
}

}
else if(a == '(')
{
if(value <= b)
{
ok = 0;
break;
}

}
else
{
if(!s.empty())
s.pop();
}

}
if(ok)
{
flag = 1;;
break;
}
else
{
while(!s.empty())
s.pop();
while(!v.empty())
v.pop();
flag = 0;
}
}
}
printf("%d\n",flag);
}

return 0;
}


思想很简单,就是一直读入字符串,读到“||”时就判断该数是否匹配栈内剩余的区间,如果匹配则直接返回1,否则继续读入以后的区间直到数据读完位置。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐