A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

package com.heima.test;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
/*
需求:编写程序 键入一个整数 在1-9随机添加加减符号(或者不加),统计出该整数所有的情况
         * 1        2        3        4        5        6        7        8        9   中间只能连接"+","-",或不用符号
         * 例如:键入 100
         * 打印台打印出:
         *         100 = 123 - 45 - 67 + 89
         *         100 = 123 - 4 - 5 + 67 + 89
         *         100 = 123 + 45 - 67 + 8 - 9
         * 共三个答案
*/
public class Ex_Text1 {
        public static void main(String[] args) throws Exception {
                //搞一个计时器,不然喝了脉动根本停不下来
                long start = System.currentTimeMillis();
                //定义一个字符数组,里面放加减和空串
                String[] arr = {"","+","-"};
                //创建一个集合,先不管他,你知道他存在过就行了
                ArrayList<String> list = new ArrayList<>();
                //录入需要组合的数
                System.out.println("请输入一个结果整数:");
                Scanner sc = new Scanner(System.in);
                int input = sc.nextInt();
                //开启死循环,无限匹配符合要求的
                while(true) {
                        //定义一个字符串数组1到9,数字与数字之间用空格隔开,空格是为了下面这个步骤的替换
                        String str = "1 2 3 4 5 6 7 8 9";
                        //定义一个循环,只要里头还有空格,我就用随机数(0-2,这个是分别对应arr数组的索引)匹配对应数组塞进来替换掉
                        while(str.contains(" ")) {
                                Random rc = new Random();
                                int r = rc.nextInt(3);
                                str = str.replaceFirst(" ",arr[r]);
                        }
//                        System.out.println("原字符串:"+str);        //以上步骤步产生了一个符合题目要求的字符串例如: 1+23+4-5-67+8+9
                       
                        //str数组数字部分(以非数字的东西切这个字符串,例如:1 23 4 5 67 8 9)
                        String[] arrstrnum = str.split("[^1-9]");        //或者用"\\D"切割,正则不太建议了解,容易走火入魔,这里只是方便做题,最稳妥的方法还是按照明哥的转成字符数组遍历判断拿下来好
                        //str符号部分(以若干个数字一起作为匹配条件,用空格替换,)
                        String strfuhao = str.replaceAll("[1-9]+", " ");//删掉数字用空格替代,得到符号字符串  + + - - + +(两边有空格.会影响切割数组的数目)
                        String[] arrfuhao = strfuhao.trim().split(" ");        //要非常非常非常非常非常注意调用trim方法去掉两边空格的操作(这个trim搞了我N久检查问题)得到例如+ + - - + +
                        //整体计算部分,这里建议大家跟着我这组例子组合代入下面算一遍.以方便理解
                        int x = 0;        //定义一个求和的数,先记着
/*                        例如这个字符串是         1+23+4-5-67+8+9
                        其对应的数字数组是        1        23        4        5        67        8        9
                        其对应的符号数组是           +    +  -    -   +  +               
                        (注意符号数组比数字数组长度少1,所以我们用数组遍历的时候,对应的符号位索引要减1)                */
                        for (int i = 0; i <= arrstrnum.length-1; i++) {
                                if (i == 0) {
                                        x = x + Integer.parseInt(arrstrnum[i]);
                                        //符号字符串数组里如果是加的字符串,我们就用+计算福对应进行操作
                                }else if (arrfuhao[i-1].contains("+")) {
                                        x = x + Integer.parseInt(arrstrnum[i]);
                                        //减号同上
                                }else if (arrfuhao[i-1].contains("-")) {
                                        x = x - Integer.parseInt(arrstrnum[i]);
                                }
                        }
//                        System.out.println(x);
                        //如果输入的数和我们用字符串求出的和(x)相等,并且我们那个集合没有这个字符串组合(不然会出重复),那么就打印出来这种组合
                        if (input == x && !list.contains(str)) {
                                System.out.println(x + "=" + str);
                                list.add(str);
                        }
                        //因为喝了炫迈停不下来(死循环不停匹配、操作、判断),所以来一个制动,测试了几次,基本上5秒内应该所有组合都能出来了,定得太长CPU要炸
                        long end = System.currentTimeMillis();
                        if (end - start == 1000*10) {
                                break;
                        }
                }
        }
}

评分

参与人数 2黑马币 +6 收起 理由
为了王者上JAVA + 3 这个注释我服!
obvilion + 3 淡定

查看全部评分

1 个回复

正序浏览
够详细!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马