首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何获得(列表中的数字)和(简单数学运算符)的所有组合

如何获得(列表中的数字)和(简单数学运算符)的所有组合
EN

Stack Overflow用户
提问于 2016-04-06 15:19:43
回答 3查看 157关注 0票数 0

好的,如果你有一个数字列表(任意大小),如下所示:

代码语言:javascript
运行
复制
[5, 7] (It's short so i can type all the combinations)

我想要一个循环,返回一个组合列表,如下所示:

代码语言:javascript
运行
复制
5+7
5-7
5*7
5/7
7+5
7-5
7*5
7/5

我已经考虑了一段时间了,我知道它是树形结构的,但我就是不知道如何让它适用于任何大小的列表。

EN

回答 3

Stack Overflow用户

发布于 2016-04-06 15:32:24

最简单的方法是使用递归算法,例如:

代码语言:javascript
运行
复制
combination(list)
  for(numbers,operators)
     combination_list+=number+operation+combination(rest)
  return combination_list

您可以使用迭代方法以及任何具有迭代副本的递归算法来完成此操作

票数 0
EN

Stack Overflow用户

发布于 2016-04-06 15:55:07

一个通用的解决方案

代码语言:javascript
运行
复制
void operations(int[] numbers){
    int size =  //determine the number of elements in the array
        for(int i=0; i < size; i++){
            for (int j = 0; j < size;j++){
                if( i !=j){
                /*do all the operations 
                      numbers[i] + numbers[j] 
                      numbers[i] - numbers[j] 
                      numbers[i] * numbers[j] 
                      numbers[i] / numbers[j] 
            */
                }
            }
        }  
   }
票数 0
EN

Stack Overflow用户

发布于 2016-04-06 16:20:13

关于这一点背后的一些组合:生成整数列表的所有可能的排序将是N!组合,然后到每个组合上,然后是它们之间的所有可能的运算符选择,运算符的数量整数之间的间距,所以4^(n-1)将这两个数字相乘,得到列表的总数: N!*(4^(n-1))

只需将第三个整数添加到列表中,就会得到96种可能的组合,以及1536的第四种组合,我相信你知道这将会非常迅速地增长。

(我还忽略了一个事实,即如果您的列表具有重复的整数,则不需要创建该列表的重复排列,因此以上所有操作仅适用于唯一整数的列表)

我想我会尝试的方法是,首先创建一个包含N个整数的所有排列的列表,以及一个包含所有N-1个运算符选择的列表。然后使用一对foreach循环将它们组合成一个更大的列表。

代码语言:javascript
运行
复制
List<Integer[]> orderings = //a bunch of arrays each one being a unique ordering of all integers in the inital listing
List<Character[]> selections = //a bunch of arrays each one being a unique selection of the 4 operators
List<String> combinations = new ArrayList<String>();
for(Integer[] order : orderings) {
    for(Character[] selection : selections) {
        //now combine order (numbers) and selection(operators) alternating between indexes
        String combination = order[0].toString();
        for(int i = 0; i < selection.length; i++) {
            combination += selection[i].toString() + order[i+1].toString();
        }
        combinations.add(combination);
    }
}

生成数字的排列就像找到一副牌的所有可能的排序一样,这是一个在堆栈溢出的其他地方应该有许多容易找到的解决方案的问题,并且找到所有运算符的选择也不是很难。

编辑:哦,我刚刚意识到我不确定你是否只想要成对的数字,所以一个包含3个数字的列表只会输出任意两个整数的对,而不是包含全部3的排序,如果只是成对的数字,那么问题就会变得简单一些。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36444106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档