南桥杯Java趣味算式



    匪警请拨110,即使手机欠费也可拨通!


    为了保障社会秩序,保护人民群众生命财产安全,警察叔叔需要与罪犯斗智斗勇,因而需要经常性地进行体力训练和智力训练!


    某批警察叔叔正在进行智力训练:


    1 2 3 4 5 6 7 8 9 = 110;


    请看上边的算式,为了使等式成立,需要在数字间填入加号或者减号(可以不填,但不能填入其它符号)。之间没有填入符号的数字组合成一个数,例如:12+34+56+7-8+9 就是一种合格的填法;123+4+5+67-89 是另一个可能的答案。


    请你利用计算机的优势,帮助警察叔叔快速找到所有答案。


    每个答案占一行。形如:


12+34+56+7-8+9
123+4+5+67-89
......


    已知的两个答案可以输出,但不计分。
    
    各个答案的前后顺序不重要。


   注意:


    请仔细调试!您的程序只有能运行出正确结果的时候才有机会得分!
    
    请把所有类写在同一个文件中,调试好后,存入与【考生文件夹】下对应题号的“解答.txt”中即可。
    
    相关的工程文件不要拷入。
    
    请不要使用package语句。
    
    源程序中只能出现JDK1.5中允许的语法或调用。不能使用1.6或更高版本。
import java.util.ArrayList;


public class Maths {
	
	/**
	 * 计算表达式的值
	 * @param s
	 * @return
	 */
	public static int MathExpression(String s){
		ArrayList<Character> oper = new ArrayList<Character>();
		ArrayList<Integer> num = new ArrayList<Integer>();
		
		if(!(s.contains("+") || s.contains("-"))) {
			return Integer.parseInt(s);
		} else {
			
			int start = 0;
			int end = 0;
			for(int i=0; i<s.length(); i++){  
				if(s.charAt(i) == '+' || s.charAt(i) == '-') {
					String s1 = s.substring(start, i);
					//System.out.println(s1);
					start = i+1;
					num.add(new Integer(s1));
					oper.add(s.charAt(i));
				} else if (s.length()-1 == i) {
					String s1 = s.substring(start, s.length());
					//System.out.println(s1);
					num.add(new Integer(s1));
				}
			}
			
			int sum = num.get(0);
			int index = 1;
			for(int j=0; j<oper.size(); j++){
				switch(oper.get(j)) {
				case '+' :
					sum += num.get(index++);
				//	System.out.println(sum);
					break;
					
				case '-' :
					sum -= num.get(index++);
				//	System.out.println(sum);
					break;
				}
			}
			
			return sum;
		}
		
		
	}
	
	/**
	 * 遍历所有出所有的可能,并输出
	 * 
	 */
	public static void print(){
		String[] arr = new String[17];
		arr[0] = "1";
		arr[2] = "2";
		arr[4] = "3";
		arr[6] = "4";
		arr[8] = "5";
		arr[10] = "6";
		arr[12] = "7";
		arr[14] = "8";
		arr[16] = "9";
		
		
		for(int i=0; i<Math.pow(3, 8); i++){
			StringBuffer sb = new StringBuffer();
		 	int p=i;  
            int tmp=p%3;  
            for(int j=0;j<8;j++)  
            {  
                switch (tmp)   
                {  
                case 0:  
                	arr[2*j+1] = "";
                    break;  
                case 1:  
                	arr[2*j+1] = "+";
                    break;  
                case 2:
                	arr[2*j+1] = "-";
                    break;  
                default:  
                    break;  
                }  
                p=p/3;  
                tmp=p%3;  
            }
            
            for(int k=0; k<arr.length; k++){
            	sb.append(arr[k]);
            }
            
            if(MathExpression(sb.toString()) == 110) {
            	System.out.println(sb.toString());
            }
           // System.out.println(sb.toString());
            
		}
	}

	
	public static void main(String[] args) {
		Maths.print();
	}
	
	
	//输出
//	12-3+4-5+6+7+89
//	123+4+5+67-89
//	1+234-56-78+9
//	1+2+34+5+67-8+9
//	12+34+56+7-8+9
//	123+4-5-6-7-8+9
//	1-2+3+45-6+78-9
//	123-4+5-6-7+8-9
//	12+3+45+67-8-9
//	123-4-5+6+7-8-9
	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值