乘/除给定一个运算符数组和一个数字数组

时间:2019-02-22 19:49:02

标签: java arrays math

任务:给定一个带有'*'或'/'的字符数组(称为运算符数组)和一个浮点数组,按运算符数组中字符的顺序乘/除数字。数组中的最后一个条目应包含最终答案,而其余索引为null。

假设您有1/2 * 3 * 4/5 * 6 数字数组将为[1.0,2.0,3.0,4.0,5.0,6.0],运算符数组将为[/,*,*,/,*]。我正在获取nums [i] = null行的索引错误,但我不明白为什么(因为如果我获取nums [i]的索引错误,为什么我没有获得nums [ i ++]?)。

ops是运算符数组,nums是数字数组。

for(int i = 0; i < ops.length; i++){
    if(ops[i] == '*') {
       nums[i++] = nums[i]*nums[i++];
       nums[i] = null;
     }else if(ops[i] == '/') {
       nums[i++] = nums[i]/nums[i++];
       nums[i] = null;
     }
}

谢谢!

3 个答案:

答案 0 :(得分:0)

显然,这不能解决操作顺序,但是由于您仅处理除法和乘法(它们是关联的),因此它仍然有效。

使用第一个数字初始化结果,然后循环遍历其余数字,并使用适当的运算符计算具有运行结果的当前数字。

public class Calculator {
    public static void main(String[] args) {
        double[] numbers = { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 };
        String[] operators = { "/", "*", "*", "/", "*" };

        System.out.println(compute(numbers, operators)); // 1 ÷ 2 * 3 * 4 ÷ 5 * 6 = 7.2
    }

    private static double compute(double[] numbers, String[] operators) throws IllegalArgumentException {
        if (operators.length != numbers.length - 1) {
            throw new IllegalArgumentException("operator count must be one less than number count");
        }
        double result = numbers[0];
        if (numbers.length > 1) {
            for (int i = 1; i < numbers.length; i++) {
                switch (operators[i - 1]) {
                    case "+":
                        result += numbers[i];
                        break;
                    case "-":
                        result -= numbers[i];
                        break;
                    case "*":
                        result *= numbers[i];
                        break;
                    case "/":
                        result /= numbers[i];
                        break;
                }
            }
        }
        return result;
    }
}

答案 1 :(得分:0)

i++返回表达式的i值,然后在对表达式求值后以i递增。

您最有可能想做的事:

for(int i = 0; i < ops.length; i++){
    if(ops[i] == '*') {
       nums[i+1] = nums[i]*nums[i+1];
       nums[i] = null;
     }else if(ops[i] == '/') {
       nums[i+1] = nums[i]/nums[i+1];
       nums[i] = null;
    }
}    

由于这些原因,您应该在应该i之前进行递增。

阅读this,了解有关后缀/前缀增量(++)的更多信息。

答案 2 :(得分:0)

如果字符数组仅包含'*'或'/',则可以使用       下面的代码以减少代码行数

  //Usage of Ternary Operator
  for(int i = 0; i < ops.length; i++){
          nums[i+1] = ops[i]=='*'?  nums[i] * nums[i+1]: nums[i]/nums[i+1];  
          nums[i]=null;
   }