• 华为编程大赛——判断给定数是否满足条件


    判断给定数是否满足给定条件要求

     题目描述:

    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
    
    */


  • 相关阅读:
    linux下&quot;=&quot;号与&quot;==&quot;号
    设单链表中存放n个字符,试设计一个算法,使用栈推断该字符串是否中心对称
    Android系统开发(2)——GDB调试工具
    JavaScript、jQuery、HTML5、Node.js实例大全-读书笔记4
    我的编程之路(十八) 团队开发
    C语言中的函数指针
    BeagleBone Black 板第三课:Debian7.5系统安装和远程控制BBB板
    爱尔威火星车 AirWheel 电动独轮车
    祖国版SoloWheel:Airwheel爱尔威火星车 拆箱&上手经验_运动户外_晒物广场_什么值得买
    打工女孩 (豆瓣)
  • 原文地址:https://www.cnblogs.com/sjw1357/p/3863982.html
Copyright © 2020-2023  润新知