1至9任意插入加减号值为100的组合

有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();
	}
	
}


好的,我可以为您介绍一下如何设计这个英汉词典。 首先,我们可以使用有序线性表来实现这个字典,因为有序线性表可以保证单词按照字母顺序排列,方便查找。在具体实现中,我们可以使用数组来存储单词,并使用二分检索算法来实现查找操作。 具体步骤如下: 1. 定义一个结构体来表示单词,包括单词本身和其对应的中文解释。例如: ```c++ struct Word { string word; string meaning; }; ``` 2. 定义一个有序数组来存储单词,例如: ```c++ const int MAX_SIZE = 1000; // 数组最大容量 Word dict[MAX_SIZE]; // 字典数组 int size = 0; // 当前字典大小 ``` 3. 实现查找操作。使用二分检索算法实现查找操作,如果找到单词,则返回其在数组中的下标,否则返回-1。例如: ```c++ int binarySearch(string word) { int low = 0, high = size - 1; while (low <= high) { int mid = (low + high) / 2; if (dict[mid].word == word) { return mid; } else if (dict[mid].word < word) { low = mid + 1; } else { high = mid - 1; } } return -1; // 没有找到 } ``` 4. 实现插入操作。先使用二分检索算法查找单词,如果找到,则提示用户单词已经存在;否则,在合适位置插入单词,并将字典大小加1。例如: ```c++ void insert(string word, string meaning) { int pos = binarySearch(word); if (pos != -1) { cout << "单词已经存在!" << endl; } else { int i; for (i = size - 1; i >= 0 && dict[i].word > word; i--) { dict[i + 1] = dict[i]; } dict[i + 1].word = word; dict[i + 1].meaning = meaning; size++; cout << "插入成功!" << endl; } } ``` 5. 实现删除操作。先使用二分检索算法查找单词,如果找到,则将其从数组中删除,并将字典大小减1;否则,提示用户单词不存在。例如: ```c++ void remove(string word) { int pos = binarySearch(word); if (pos != -1) { for (int i = pos; i < size - 1; i++) { dict[i] = dict[i + 1]; } size--; cout << "删除成功!" << endl; } else { cout << "单词不存在!" << endl; } } ``` 完成上述步骤后,英汉词典就完成了。您可以将这些代码组合起来,然后编写一个测试程序,测试这些操作是否正常工作。测试数据可以是任意英文单词。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值