首页 > 试题广场 >

奇怪的表达式求值

[编程题]奇怪的表达式求值
  • 热度指数:2588 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
常规的表达式求值,我们都会根据计算的优先级来计算。比如*/的优先级就高于+-。但是小易所生活的世界的表达式规则很简单,从左往右依次计算即可,而且小易所在的世界没有除法,意味着表达式中没有/,只有(+, - 和 *)。现在给出一个表达式,需要你帮忙计算出小易所在的世界这个表达式的值为多少

输入描述:
输入为一行字符串,即一个表达式。其中运算符只有-,+,*。参与计算的数字只有0~9. 保证表达式都是合法的,排列规则如样例所示。


输出描述:
输出一个数,即表达式的值
示例1

输入

3+5*7

输出

56

//引入readline模块

var readline = require('readline');

//创建readline接口实例

var ri = readline.createInterface({

    input: process.stdin,

    output: process.stdout

});


//获取输入数据并进行操作

ri.on('line',function(line){

    var nums = line.match(/(\d+)/g);    //把表达式中的数字存到数组nums中

    var symbol = line.match(/\+|\-|\*/g);   //把表达式中的符号存到数组symbol中

    var arr = [];

    var len1 = nums.length;

    var len2 = symbol.length;

    var len = Math.min(len1,len2);

    //将数字和符号整合到一个数组中

    for(var i = 0; i < len; i ++){

        arr.push(nums[i]);

        arr.push(symbol[i]);

    }

    arr.push(nums[len1-1]);

    //将数组转换成字符串

    var str = arr.join("");

    var result = parseInt(str.charAt(0));

    for(var i = 1; i < (len1 + len2); i ++){

        if(str.charAt(i) == '+'){

            i ++;

            var temp = parseInt(str.charAt(i));

            result = result + temp;

        }else if(str.charAt(i) == '-'){

            i ++;

            var temp = parseInt(str.charAt(i));

            result = result - temp;

        }else if(str.charAt(i) == '*'){

            i ++;

            var temp = parseInt(str.charAt(i));

            result = result * temp;

        }

    }

    console.log(result);

    

})

发表于 2017-03-29 21:21:54 回复(1)
var readline = require('readline');
var rl= readline.createInterface({
	input : process.stdin,
	output : process.stdout
})
var num = 0;
var mod = "+";
rl.on("line",function(input){
    input.replace(/(\d+)([-+*]|)/g,function($0,$1,$2){
        $1=~~$1;
        //对num和$1进行求值运算 第一次是计算0+$1
        num=({
            "+":num+$1,
            "-":num-$1,
            "*":num*$1
        }[mod]);
        //记录下一次的求值方式
        mod=$2;
        return $0;
    })
    console.log(num);
    num=0;
})

编辑于 2017-03-29 10:10:31 回复(0)
当时做题的时候没有通过,今天把当时写的代码复制上来就AC了,是怎么回事。。

var readline = require('readline')
var  ri  = readline. createInterface({
   input : process.stdin,
   output : process.stdout
})

var get_result = function (a, b, x) {
  if (x  === '-') {
    return  parseFloat(a) -  parseFloat(b)
  } else if (x  === '+') {
    return  parseFloat(a) +  parseFloat(b)
  } else if (x  === '*') {
    return  parseFloat(a) *  parseFloat(b)
  }
}

ri . on('line'function (line) {
  var  nums  =  line . match(/( \d + )/ g)
  var  p  =  line . match(/ [\+\-\*] / g)
  var  temp  = get_result(nums[0], nums[1], p[0])
  var  p_n  = 1
  for (var  i  = 2; i  <  nums . length; i  ++, p_n  ++) {
    temp  = get_result(temp, nums[i], p[p_n])
  }
  console. log(temp)
})
发表于 2017-03-26 14:19:55 回复(1)