给定+、/、-、*的允许运算符,并给出用户输入的单数列表(允许的长度),我如何输出所有可能的数学表达式组合(以及由此产生的值),这些数学表达式可以由这些数字和给定的常量集合组成?例如,我还希望允许可伸缩性,这样我就可以轻松地在混合中添加另一个操作符(如果可能的话)。
最好,解决方案不会使用堆栈或队列,但它们不是不可接受的。
例如,如果输入是:
{1,3,5,7}那么可能的输出是
(1+3)-(5+7) = -8
(1+5)-(3-7) = 10
etc... (13+57) 不是是一个可能的组合,因为不应该允许合并数字。
还要注意:我能够使用Scheme编写类似的东西,但是我似乎不能用Java或C#来完成它。
发布于 2009-12-21 18:45:32
我不是一个Java或C#程序员,所以这里有一个语言无知的答案。您所选择的语言似乎都不具有eval函数。我建议你采用反向波兰符号。将输入捕获为字符串中的字符或任何您希望的内容;将运算符也编码为字符。然后,使用迭代器或其他任何方法,生成输入数字的所有可能顺序,然后是正确数目的二进制运算符的所有可能顺序。然后使用几个左右的switch语句将每个字符串转换为结果。
抱歉,我不能说得更清楚了,我得赶紧了。
发布于 2009-12-21 20:42:05
经典排列问题。
诀窍是传递一组函数指针来创建操作符数组(堆栈、列表等)。在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]));
}
}
}等等。
https://stackoverflow.com/questions/1939902
复制相似问题