华为编程大赛——判断给定数是否满足条件
判断给定数是否满足给定条件要求
题目描述:
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 */