[英]Perform arithmetic operations from operators defined as strings
我最近一直試圖找到解決這個問題的方法,但到目前為止我一直沒有成功。
我正在考慮對a # b # c # d
,其中a,b,c和d是預定義的常量,#可以取以下任何運算符'+',' - ','*'的值, '/'。
我正在考慮為a # b # c # d
找到所有可能的(不同的)解決方案,以便在#中替換所有運營商。
我在想以下幾行的邏輯:
// Global declaration of an array list
static ArrayList<Double> values;
String[] chars = {"+", "-", "*", "/"};
int totalSolutions = 0;
values = new ArrayList<Integer>();
for (int i=0; i<chars.length; i++){
for (int j=0; j<chars.length; j++){
for (int k=0; k<chars.length; k++){
if (isNew(a chars[i] b chars[j] c chars[k] d)) totalSolutions += 1;
}
}
}
public static boolean isNew(double value){
if (values.contains(value)) return false;
else values.add(value);
return true;
}
isNew()是一個函數,它只檢查所獲得的新解決方案是否與獲得的所有先前解決方案不同。
我還沒有找到在操作數之間應用運算符的方法。
非常感謝任何幫助。
從JDK1.6開始,您可以使用內置的Javascript引擎為您評估此表達式。
import javax.script.ScriptEngineManager;
import javax.script.ScriptEngine;
public class Main {
public static void main(String[] args) throws Exception{
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
String expression = "100+200/100*2";
System.out.println(engine.eval(expression));
}
}
因此,您可以根據運算符優先級規則使用它來計算表達式。
此外,如果您只需要解決方案的數量,則可能更容易使用TreeSet
然后在最后打印集合的大小。
這是一個完整的解釋:
public class Main {
public static void main(String[] args) {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
int a = 100;
int b = 200;
int c = 300;
int d = 100;
String[] chars = {"+", "-", "*", "/"};
try {
TreeSet<String> set = new TreeSet<>();
for (int i=0; i<chars.length; i++){
for (int j=0; j<chars.length; j++){
for (int k=0; k<chars.length; k++){
String expression = a+chars[i]+b+chars[j]+c+chars[k]+d;
set.add(String.valueOf(engine.eval(expression)));
}
}
}
System.out.println(set.size());
} catch (ScriptException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.