我想创建一个函数,我将一个数字作为参数(like 8
)传递给它,它将返回由4 different numbers
和3 different operators
组成的所有可能组合的列表,这是加法(+),减法( - ),除法(/)或乘法(*)
e.g:
4 * 2 + 4 - 1 = 11
我将11
作为参数传递给函数,它将返回所有可能的组合,如上面的那个。一个限制是来自四个will not be greater then 15
的每个数字。
最好使用C#。
答案 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;
}
}
我认为这会奏效。这是可怕的,可能有一两个错误,但这是一般的想法,我真的没有看到更好的方法。
您是否希望退回所有组合?或者只计算多少组合?