1 2 3 4 5 6 7 8 9 =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或更高版本。

这道题只是考寻路问题而已。我改了一下。把路径也可以打印出来了。

分析:

这道题,只要切入点找准了,就可以很快解出来,我的解法是这样的,这里有9个数字,那么数字与数字之间有八个空,每个空的有三种情况:加号、减号、空,每个空有三种可能,一共有八个空,所以有3^8=6561中可能,这种方法是穷举所有的可能情况,所以个人感觉还可以优化!

编程时候,我用8个整数的整形数组来记录这八个空情况,0代表没有插入,1代表插入”+”号,2代表插入”-“,最后通过该整形数组转换成对应的表达式,再计算其最终结果,如果为110,则输出!

    public class oneOneZero  
    {  
        public static void main(String[] args)  
        {  
            int[] result=new int[8];  
            getResult(0,result);  
        }  
        //使用递归求出3^8种情况  
        public static void getResult(int index,int[] result){  
            if(index==8){  
                showResult(result);//根据数组的取值转换成表达式,且求值,这方法有待改进,写的很乱  
                return;  
            }  
            //每个空有三种可能,0,1,2  
            for(int i=0;i<3;i++){  
                result[index]=i;  
                getResult(index+1,result);  
                result[index]=0; //恢复原来的状态  
            }  
        }  
        public static void showResult(int[] result){  

            int sum=0;  
            //默认在第一个数字,即1之前是"+"号,方便编程而已  
            char operateChar='+';  
            String[] source=new String[]{"1","2","3","4","5","6","7","8","9"};  
            //最终的表达式,最好用StringBuilder,在非多线程的情况下,字符串拼接的性能,StringBuilder最好,  
            //当然用StringBuffer或者单纯的String也可以  
            StringBuilder expression=new StringBuilder();  
            //用于记录临时的数字,因为参与运算的数字可能是几位的数字,所以也需要拼接  
            StringBuilder number=new StringBuilder();  
            //先加入第一个字符,即1  
            number.append(source[0]);  

            expression.append(source[0]);  

            for(int i=0;i<result.length;i++){  
                if(result[i]==0){//如果为0,表示数字合并  
                    number.append(source[i+1]);  
                    expression.append(source[i+1]);  
                }else if(result[i]==1){  
                    sum=calc(operateChar,sum,number);  
                    operateChar='+';  
                    number.append(source[i+1]);  
                    expression.append("+").append(source[i+1]);  
                }else if(result[i]==2){  
                    sum=calc(operateChar,sum,number);  
                    operateChar='-';  
                    number.append(source[i+1]);  
                    expression.append("-").append(source[i+1]);  
                }  
            }  
            sum=calc(operateChar,sum,number);  
            if(sum==110){  
                System.out.print(expression.toString()+"=110");  
                System.out.println();  
            }  
        }  
        public static int calc(char operateChar,int sum,StringBuilder number){  
            if(operateChar=='+'){  
                sum+=Integer.parseInt(number.toString());  
                number.delete(0, number.length());  
            }else if(operateChar=='-'){  
                sum-=Integer.parseInt(number.toString());  
                number.delete(0, number.length());  
            }  
            return sum;  
        }   

    }  

输出结果:

    123+4+5+67-89=110  
    123+4-5-6-7-8+9=110  
    123-4+5-6-7+8-9=110  
    123-4-5+6+7-8-9=110  
    12+34+56+7-8+9=110  
    12+3+45+67-8-9=110  
    12-3+4-5+6+7+89=110  
    1+234-56-78+9=110  
    1+2+34+5+67-8+9=110  
    1-2+3+45-6+78-9=110  
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值