判断给定数是否满足给定条件要求
题目描述:
1、 条件是一个字符串,其格式由数学上的“开闭区间”,"&&"和"||"组成。其格式为:[5,7]&&(6,9]||(10,20),该条件表示“大于等于5,小于等于7”并且“大于6,小于9”或者“大于10,小于20”。
2、 &&优先级高于||。
输入:
1、 字符串1:上述描述格式的条件:如[5,7]&&(6,9]||(10,20)
2、 数字:判断是否满足条件的数字:9
说明:上诉两个参数是在一行中输入的,其格式为:字符串1+空格+数字。如[1,2]||(3,4) 3
输出:
如果满足条件,则输出1,否则0。
样例输入:
[1,2]||(3,4] 3
2.3.5 样例输出:
0
思路:使用string类的处理函数,将大问题分割为子问题,再利用分治的方法求得。
#include<iostream>
#include<string>
#include<cstdlib>
using namespace std;
int func(string str ,int num){
string orStr("||");//首先从or出断开进行递归。
string andStr("&&");//然后从and处断开进行递归。
string::size_type startPos=0,endPos=0;
if( ( endPos=str.find_first_of(orStr,startPos) )
!=string::npos ){//若存在||符号,则将问题拆分为两个子问题。
return
func( str.substr(startPos,endPos-startPos), num )||
func( str.substr(endPos+2,str.size()-endPos-2), num );
}
if( (endPos=str.find_first_of(andStr) )
!=string::npos ){//若不存在||,但是存在&&符号,则仍为两个子问题。
return
func( str.substr(startPos,endPos-startPos), num )&&
func( str.substr(endPos+2,str.size()-endPos-2), num );
}
//程序执行到这里,说明已经只有[],[),(],()四种情况了。
const string::size_type n=str.size()-1;
string left,right;
string::size_type sep=str.find(",");
left=str.substr(1,sep);
right=str.substr(sep+1,n-sep-1);
int num1=atoi(left.c_str());
int num2=atoi(right.c_str());
char head=str[0],tail=str[n-1];
if(str[0]=='['){
if(str[n]==']'){//[]
return num1<=num && num<=num2;
}else if(str[n]==')'){
return num1<=num && num< num2;
}
}else if(str[0]=='('){
if(str[n]==']'){//(]
return num1<num && num<=num2;
}else if(str[n]==')'){
return num1<num && num<num2;
}
}
return 0;
}
int main(){
string str;
int num;
while( cin>>str>>num)
cout<<func(str,num)<<endl;
return 0;
}
/*
[1,8]&&(7,11]&&[8,9)||(1,2) 8
[1,8)&&(7,11]&&[8,9)||(1,2) 8
[1,2]||(3,4] 3
[1,2]||[3,4] 3
*/