从定义为字符串的运算符执行算术运算

阿迪亚

我最近一直在试图找到解决该问题的方法,但是到目前为止,我一直没有成功。

我正在考虑进行操作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()是一个函数,它仅检查所获得的新解决方案是否与所有先前获得的解决方案不同。

我还没有找到在操作数之间应用运算符的方法。

在此方面的任何帮助将不胜感激。

艾哈迈德·阿姆(Ahmed Amr)

从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);
        }
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何对表示为字符串的值和运算符进行算术运算?

将字符串转换为算术运算符

带有算术运算符加法运算的 Swift 字符串数组

为执行相同操作的字符串更改符号 +(如运算符重载)

将条件运算符解析为字符串并用作条件运算符

未为字符串“”和类型“ Range”定义错误运算符“&”。

为cpp中的双精度和字符串数据类型定义运算符+

未为参数类型定义运算符+字符串,无效

开始获取错误“运算符 '=' 未为类型 DBNULL 和字符串定义

把字符串变成运算符

==字符串运算符

查询字符串运算符

字符串的散布运算符

字符串和?:运算符

匹配字符串中的算术运算符,但不匹配负数

如何从字符串中分离数字和算术运算符?

试图对表示为字符串的数字执行算术运算

使用Java流对concat字符串执行算术运算

如何在Java中对字符串执行算术运算?

Lua:尝试对字符串值执行算术运算

Lua错误“试图对字符串值执行算术运算”

每次出现算术运算符时都会拆分一个字符串

.net核心字符串运算符不以例外结果执行

输入带有比较运算符的字符串并对数组索引执行比较

如何在字符串中用点(。)运算符替换箭头运算符(->)

C ++串联;字符串+双; 运算符+与运算符+ =

R:如何像在Python中那样定义+符号作为连接字符串的运算符?

Emscripten在C ++中等待运算符。返回未定义而不是字符串值

重新定义<运算符以在stl算法中使用字符串