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;
}
}
}
}
|