小兄弟,问题给你解决了,时空性都考虑到了,九层循环太浮夸,这个还有优化空间
import java.util.*;
import org.apache.commons.collections.map.LinkedMap;
import org.apache.commons.lang3.StringUtils;
public static void main(String[] args) {
//1 求出 ** X * = ***
List<Integer> numArr = Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
//2 从1中筛选 ** X * = *** = ** X * 且(*处于0-9)
findShouer(numArr);
}
private static void findShouer(List<Integer> numArr) {
Map<Integer, String> maps = new LinkedMap();
int[] flagArr = getInts();
for(int key1=0;key1<numArr.size();key1++){
//选取 ** X *里的第一个因数十位*,并给对应标志数组打已用标志
flagArr[key1]=1;
for(int key2:getLiftChoice(flagArr)){
//选取 ** X *里的第一个因数个位*,并给对应标志数组打已用标志
flagArr[key2]=1;
for(int key3:getLiftChoice(flagArr)){
//选取 ** X *里的第二个因数*,并给对应标志数组打已用标志
flagArr[key3] = 1;
//选取符合***不与因数重合条件的所有积
Set<Integer> listResult = getListResult(getLiftChoice(flagArr));
int temp = (numArr.indexOf(key1) * 10 + numArr.indexOf(key2)) * numArr.indexOf(key3);
if(listResult.contains(temp)){
if(maps.containsKey(temp)){
if(!StringUtils.containsAny(maps.get(temp)+""+temp,key1+"",key2+"",key3+""))
System.out.println(maps.get(temp)+"="+key1+""+key2+"*"+key3);
}else{
maps.put(temp,key1+""+key2+"*"+key3+"="+temp);
}
}
flagArr[key3] = 0;
}
flagArr[key2] = 0;
}
flagArr[key1] = 0;
}
}
private static Set<Integer> getListResult(List<Integer> liftChoice) {
Set<Integer> resultList=new LinkedHashSet<>();
for(int i=0;i<liftChoice.size();i++){
int bai=liftChoice.get(i)*100;
for(int j=0;j<liftChoice.size();j++) {
int shi = liftChoice.get(j) * 10;
for (int k = 0; k < liftChoice.size(); k++) {
int ge = liftChoice.get(k);
if(i!=j&&i!=k&&j!=k)
resultList.add(bai+shi+ge);
}
}
}
return resultList;
}
private static int[] getInts() {
int[] flagArr={0,0,0,0,0,0,0,0,0,0};
return flagArr;
}
private static List<Integer> getLiftChoice(int[] flagArr) {
List<Integer> numChoice =new ArrayList<>();
for(int i=0;i<flagArr.length;i++){
if(1!=flagArr[i]){
numChoice.add(i);
}
}
return numChoice;
}
定义1~9,放入数组,随机取值,取值后去掉该值
逻辑最简单,效率最低的写法就是写9个循环,一个一个的试
暴利破解法。
从1~9中不重复的排列出9个数,按照先后顺序填入两个等式中,正好9个空位,如果两个等式成立,那就是结果。