需要知道所有可能的4个数字,可以+, - ,乘以,除以得到特定数字

时间:2016-08-13 05:30:09

标签: c# math numbers

我想创建一个函数,我将一个数字作为参数(like 8)传递给它,它将返回由4 different numbers3 different operators组成的所有可能组合的列表,这是加法(+),减法( - ),除法(/)或乘法(*)

e.g:

4 * 2 + 4 - 1 = 11

我将11作为参数传递给函数,它将返回所有可能的组合,如上面的那个。一个限制是来自四个will not be greater then 15的每个数字。

最好使用C#。

2 个答案:

答案 0 :(得分:2)

我建议做一个蛮力,因为组合的数量很少。只需对所有数字0-15的第一个数字进行四次算术运算,然后对下一个数字进行重复等等。 11.这与现代计算机不相符。不需要任何花哨的算法。有更聪明的方法可以做到这一点,但实施起来有些棘手。

答案 1 :(得分:0)

这里有无数的答案。比如你传给11:

15 - 4 + 5 - 5 = 11

15 - 3 + 5 - 6 = 11

15 - 2 ......

如果你想要一个真正的答案,你将不得不更加严格地约束

按照等式来表示,你要求所有的离散解决方案

a + b + c + d = 11,其中a,b,c,d <= 15。如果你把它绑定在低端,比如0&lt; = a,b,c,d&lt; = 15,你仍然会有很多答案,但至少它是有限的。

编辑:

确定。你说约束0&lt; = a,b,c,d&lt; = 15.这不会很漂亮。

int[] possibleNums = new int[] {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

可能的运营商+ - * /

char[] operators = new char[] {'+', '-', '*', '/'};

现在,您希望所有操作都使用等于输入数字的任意组合。

int WhyWouldIEverDoThis(int num) {
    int counter = 0;
    foreach(var a in possibleNums) {
        foreach(var op1 in operators) {
            foreach(var b in possibleNums) {
                foreach(var op2 in operators) {
                    foreach(var c in possibleNums) {
                        foreach(var op3 in operators) {
                            foreach(var d in possibleNums) {
                                int result = 0;
                                if(op1 == '*' || op1 == '/') {
                                    result = applyOperator(a,b,op1);
                                    if(op2 == '*' || op2 == '/') {
                                        result = applyOperator(applyOperator(result, c, op1), d, op3);
                                    } else if (op3 == '*' || op3 == '/') {
                                        result = applyOperator(result, applyOperator(c,d,op3), op2);
                                    }
                                } else {
                                    if(op2 == '*' || op2 == '/') {
                                        if(op3 == '*' || op3 == '/') {
                                            result = applyOperator(a, applyOperator(applyOperator(b,c,op2), d, op3), op1);
                                        } else {
                                            result = applyOperator(a, applyOperator(b,c,op2), op1);
                                            result = applyOperator(result, d, op3);
                                        }
                                    } else {
                                        result += applyOperator(a,b,op1);
                                        if(op3 == '*' || op3 == '/') {
                                            result = applyOperator(result, applyOperator(c,d,op3), op2);
                                        } else {
                                            result = applyOperator(result, c, op2);
                                            result = applyOperator(result, d, op3);
                                        }
                                    }
                                }
                                if(result == num)
                                    counter++;
                            }
                        }
                    }
                }
            }
        }
    }
}

int applyOperator(int a, int b, char operator) {
    if(operator == '+') {
        return a + b;
    } else if (operator == '-') {
        return a - b;
    } else if (operator == '*') {
        return a * b;
    } else {
        return a / b;
    }
}

我认为这会奏效。这是可怕的,可能有一两个错误,但这是一般的想法,我真的没有看到更好的方法。

您是否希望退回所有组合?或者只计算多少组合?