给定允许的+,/, - ,*运算符,并给出用户输入的单位数字列表(允许任意长度),如何输出所有可能的数学表达式组合(和结果值)可以用数字和给定的常数运算符组成吗?例如,我还希望允许可伸缩性,这样我就可以轻松地在混合中添加另一个运算符(如果可能的话)。
优选地,解决方案不会使用堆栈或队列,但它们不是不可接受的。
例如,如果输入为:
{1,3,5,7}
那么可能的输出将是
(1+3)-(5+7) = -8
(1+5)-(3-7) = 10
etc...
(13 + 57)不可能的组合,因为不应该允许组合数字。
另请注意:我能够使用Scheme编写类似的东西来执行此操作,但我似乎无法使用Java或C#。
答案 0 :(得分:4)
我不是Java或C#程序员,所以这里有一个语言无知的答案。您选择的语言似乎都没有eval功能。我建议你采用反向波兰表示法。将输入捕获为字符串中的字符或任何您想要的内容;将运算符编码为字符。然后,使用迭代器或其他,生成输入数字的所有可能的排序,然后是正确数量的二元运算符的所有可能排序。然后使用一对左右的switch语句将每个字符串转换为结果。
抱歉,我不能更明确,不得不赶时间。
答案 1 :(得分:0)
经典排列问题。
诀窍是传入一组函数指针来创建一个运算符数组(堆栈,列表等等)。在C#和Java中,函数指针可以由对象和接口实现。
然后,您需要提出每个列表的所有各种排序。
另请注意,您只能拥有3个运算符,并且某些运算符是否可以以不同方式应用于任意一侧的集合,这是不明确的。
例如//
a+b / c - d <> (a+b) / (c-d)
我不确定是否还要考虑括号。如果是,那么解决方案有点棘手(虽然原理是相同的)。简单地包括一组括号并渗透它们(尽管你还必须考虑左括号必须具有右右括号的约束)。我不会在这里介绍。
输入的排列算法比比皆是,所以只需选择一个并使用它来生成所有运算符和数字的集合。
要计算所有结果,只需迭代运算符列表,顺序传递数字列表就可以了。
例如//
public interface Operator {
public Double calc(int val1, int val2);
}
public class Add implements Operator {
public Double calc(int val1, int val2){
return Double(val1 + val2);
}
}
public class Sub implements Operator {
public Double calc(int val1, int val2){
return Double(val1 - val2);
}
}
public class Mul implements Operator {
public Double calc(int val1, int val2){
return Double(val1 * val2);
}
}
public class Div implements Operator {
public Double calc(int val1, int val2){
return Double(val1 / val2);
}
}
public static Double calc(Operator[] operator_list, int[] value_list)
{
Double ret_val = Double(value_list[0]);
for (int j = 0; j < operator_list.length(); j++){
Operator oper = operator_list[j];
ret_val = oper.calc(ret_val, value_list[j+1]);
}
return ret_val;
}
public static void main(String[] args)
{
int[] values = {1,2,3,4};
Operator add = new Add();
Operator div = new Div();
Operator mul = new Mul();
Operator sub = new Sub();
Operator[] operators = {add, div, sub, mul};
// Calculate from permutation algorithm...
// Don't forget to only generate three values for each permutation!
// out_perm_1 = {add, div, sub};
// out_perm_2 = {div, add, sub};
Operator[] operator_permutations = perm(operators);
// Calculate from permutation algorithm...
// val_perm_1 = {1,2,3,4};
// val_perm_2 = {2,1,3,4};
int[] value_permutations = perm(values);
// Interleave the two lists...
for (int i=0; i < output_permutations.length(); i++)
{
for (int j=0; j < value_permutations.length(); j ++)
{
System.out.println(calc(output_permutations[i], output_permutations[j]));
}
}
}
等...