有9个数字,分别是1,2,3,4,5,6,7,8,9,其中可以插入任意加减号,如123+4-5+67-89这样,把这些组合写出来。
分析1-9里有8个空隙,在8个空隙插入占位符,总和为 C(8|8)+C(8|7)+C(8|6)+C(8|5)+C(8|4)+C(8|3)+C(8|2)+C(8|1)
对于每一种插入符 ,以C(8|5)为例,加减的组合为2的5次方,代码如下:
package com.g.algorithm;
import java.text.ParseException;
import java.util.Iterator;
import java.util.Stack;
import com.alibaba.fastjson.JSON;
public class CountSumOf100 {
public static void countAll(){
int splitArr[] = new int[]{1,2,3,4,5,6,7,8};
Stack<Integer> pathStack = new Stack<Integer>();
for(int level =8 ;level>0;level--){
System.out.println("--------------------- "+level+" -----------------------------");
countPath( level,0,splitArr, pathStack);
System.out.println("--------------------- "+level+" -----------------------------");
}
//countPath( 2,0,splitArr, pathStack);
}
public static void countPath(int level,int start,int srcArr[],Stack<Integer> pathStack){
for(int i=start;i<srcArr.length;i++){
pathStack.push(srcArr[i]);
if(level>1){
countPath(level-1,i+1,srcArr,pathStack);
}
else{
printPath(pathStack);
countEquals100(pathStack);
}
pathStack.pop();
}
}
public static void printPath(Stack<Integer> pathStack){
Iterator<Integer> pathArr = pathStack.iterator();
String pathStr = "";
while(pathArr.hasNext()){
pathStr+=(pathArr.next()+"-");
}
//System.out.println(pathStr);
}
public static void countEquals100(Stack<Integer> pathStack){
StringBuffer paramStr = new StringBuffer("1");
for(int i=1;i<9;i++){
if(pathStack.contains(i)){
paramStr.append(",");
}
paramStr.append(i+1);
}
String paramArr[] = paramStr.toString().split(",");
Stack<Integer> operStack = new Stack<Integer>();
countValue(paramArr.length-1,operStack,paramArr);
//System.out.println(paramStr);
}
public static void countEquals100One(Stack<Integer> pathStack){
StringBuffer express= new StringBuffer("1,2,3,4,5,6,7,8,9");
Iterator<Integer> pathIter = pathStack.iterator();
while(pathIter.hasNext()){
int idx = pathIter.next()*2-1;
express.replace(idx, idx+1, "|");
}
String paramStr = express.toString().replace(",", "");
String paramArr[] = paramStr.split("\\|");
Stack<Integer> operStack = new Stack<Integer>();
countValue(paramArr.length-1,operStack,paramArr);
//System.out.println(paramStr);
}
public static void countValue(int number,Stack<Integer> operStack,String paramArr[]){
if(number<=0){
return ;
}
for(int i=0;i<2;i++){
operStack.push(i);
if(number==1){
int idx=1;
String express = "" +paramArr[0];
int sum = Integer.parseInt(paramArr[0]);
Iterator<Integer> operIter = operStack.iterator();
while(operIter.hasNext()){
int oper = operIter.next();
if(oper==0){
sum+=(Integer.parseInt(paramArr[idx]));
express +=("+"+paramArr[idx]);
}else{
sum-=(Integer.parseInt(paramArr[idx]));
express +=("-"+paramArr[idx]);
}
idx++;
}
if(sum==100){
System.out.println(JSON.toJSONString(express));
}
}
countValue(number-1,operStack,paramArr);
operStack.pop();
}
}
public static void main(String args[]) throws ParseException {
countAll();
}
}