首页 > 试题广场 >

奇怪的表达式求值

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

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


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

输入

3+5*7

输出

56
(⊙o⊙)…感觉跟流水账一样
package go.jacob.day914;

import java.util.Scanner;

public class Demo3 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String s = sc.nextLine();
		int sum = s.toCharArray()[0] - '0';
		for (int i = 1; i < s.length() - 1; i += 2) {
			int tmp = s.toCharArray()[i + 1] - '0';
			switch (s.toCharArray()[i]) {
			case '+':
				sum += tmp;
				break;
			case '-':
				sum -= tmp;
				break;
			case '*':
				sum *= tmp;
				break;
			}
		}
		System.out.println(sum);
		sc.close();
	}
} 


发表于 2017-09-14 10:39:40 回复(0)
更多回答
纯C写,感觉自己棒棒哒~~~~
#include <stdio.h>
#include <string.h> 
#define N 50
int main(){
	char str[N];
	gets(str);
	int result=str[0]-'0'; //得到第0个字符,并减去字符'0'使其转换成数字 
	int i,temp;
	for(i=1;i<strlen(str)-1;i+=2){  //从第二个字符开始算 
		temp=str[i+1]-'0'; //要操作的数 
		if(str[i]=='+'){
			result+=temp;  //结果 
		}else if(str[i]=='-'){
			result-=temp;
		}else if(str[i]=='*'){
			result*=temp;
		}
	}
	printf("%d\n",result);
	return 0;
}

编辑于 2017-03-29 23:49:09 回复(6)
纯手打,自己感觉棒棒哒
#include<bits/stdc++.h>
using namespace std;
long long ans,n;
char a,b;
int main()
{
    cin>>a;
    ans=a-'0';
    while(1)
    {
        a=getchar();
        if(a=='\n'||a==' ') break;
        b=getchar();
        if(a=='+') ans+=(b-'0');
        if(a=='-') ans-=(b-'0');
        if(a=='*') ans*=(b-'0');
    }
    cout<<ans;
    return 0;
}


发表于 2020-10-07 11:30:50 回复(0)
import sys
s=sys.stdin.readline().strip()
n=len(s)
res=int(s[0])
for i in range(1,n):
    if s[i]=='+':
        res+=int(s[i+1])
    if s[i]=='-':
        res-=int(s[i+1])
    if s[i]=='*':
        res*=int(s[i+1])
    i+=2
print(res)
发表于 2018-05-17 15:40:10 回复(0)
package com.coding.wangyi;

import java.util.Scanner;

public class GetValue {

    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        String parnn = s.nextLine();
        int ans=parnn.charAt(0) - '0';
        for(int i=1; i<parnn.length()-1; i=i+2) {
            int num = parnn.charAt(i+1) - '0';
            char par = parnn.charAt(i);
            switch(par) {
                case '+': {
                    ans = ans + num;
                    break;
                }
                case '*':{
                    ans = ans * num;
                    break;
                }
                case '-':{
                    ans = ans - num;
                    break;
                }
            }

        }
        System.out.println(ans);

    }

}
发表于 2018-03-11 17:25:29 回复(0)
import java.util.*;
public class Main{
    public static void main(String[] args)
        {
        Scanner sc=new Scanner(System.in);
        String s=sc.nextLine();
       char []ch=s.toCharArray();
        int first=ch[0]-'0';
        int temp=0;
        for(int i=1;i<ch.length-1;i+=2){
            temp=ch[i+1]-'0';
            if(ch[i]=='+'){
                first=first+temp;
            }
            if(ch[i]=='*'){
               first=first*temp; 
            }
            if(ch[i]=='-'){
               first=first-temp; 
            }
        }
        System.out.println(first);
    }
}
发表于 2017-08-14 21:48:05 回复(0)
#include<iostream>
#include<string>
using namespace std;

int main()
{
string s;
int res;
cin >> s;

res = s[0];
int i = 0;
while (i <= s.length() - 1){
if (s[i + 1] == '+') res = res + s[i + 2];
if (s[i + 1] == '-') res = res - s[i + 2];
if (s[i + 1] == '*') res = res * s[i + 2];
i += 2;
}
cout << res;
return 0;

}
发表于 2017-06-03 17:53:02 回复(0)
#include <iostream>
#include <string>
using namespace std;

int main()
{
    int i,sum;
    sum=0;
    string str;
    cout<<"输入公式:";
    getline(cin,str);
    switch(str[1])
    {
        case '+':sum=(str[0]-'0')+(str[2]-'0');break;
        case '-':sum=(str[0]-'0')-(str[2]-'0');break;
        case '*':sum=(str[0]-'0')*(str[2]-'0');break;
    }
    for(i=3;i<str.length();i++)
    {
        switch(str[i])
        {
            case '+':sum+=(str[i+1]-48);break;
            case '-':sum-=(str[i+1]-48);break;
            case '*':sum*=(str[i+1]-48);break;
        }
    }
    cout<<"结果是:"<<sum<<endl;
}
编辑于 2017-04-24 22:13:38 回复(0)
package expression;
import java.util.*;
/**
 * 3+5*7
 * 先来看这道题的解题步骤:
 * 1. 当遇到数字3的时候,设置一个变量cur记录下它;
 * 2. 当遇到'+'时,判断flag的状态,根据flag的状态去更新res。例如,我们设置默认的flag为'+',故res+=cur,得到res=3,
 * 并且更新flag的状态为当前的字符'+';
 * 3. 又遇到数字5,更新cur的值为5;
 * 4. 遇到符号'*',执行步骤2,根据flag的状态去更新res。由于我们之前的flag为'+',故res+=cur,为3+5=8,得到res=8,
 * 并且更新flag的状态为当前的字符'*';
 * 5. 遇到数字7,更新cur的值为7;
 * 6. 这时候已经到了表达式的最后了,也执行步骤2,故可以得到res=8*7=56。
 * 这道题的难点就在于:
 * 第一个数是负数怎么处理?-3+5*7
 * 可以看到代码中,当第一个数为负数的时候,则第一个字符为'-',故flag的状态更新为了'-'。
 * 再遇到3的时候,更新cur的值为3,再遇到字符'+',先根据flag的状态执行res-=cur,得到res=-3.
 * 后面步骤的就跟之前的一样了。
 * @author 何嘉龙
 *
 */
public class Main {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		while (in.hasNext()) {
			String str = in.nextLine();
			int res = getExpressionVal(str);
			System.out.println(res);
		}
		in.close();
	}
	public static int getExpressionVal(String str) {
		char[] chas = str.toCharArray();
		int res = 0;
		int cur = 0;
		char flag = '+';
		for (int i = 0; i < chas.length; i++) {
			if (chas[i] < '0' || chas[i] > '9' || i == chas.length - 1) {
				if (i == chas.length - 1) {
					cur = chas[i] - '0';
				}
				if (flag == '+') {
					res += cur;
				} else if (flag == '-') {
					res -= cur;
				} else {
					res *= cur;
				}
				flag = chas[i];
			} else {
				cur = chas[i] - '0';
			}
		}
		return res;
	}
}

发表于 2017-04-15 20:33:25 回复(3)
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.next();
        sc.close();
        int tmp = s.charAt(0) - '0';
        for (int i = 1; i < s.length() - 1; ) {

            char operate = s.charAt(i);
            i ++;
            StringBuilder sb = new StringBuilder();
            while ( i < s.length() && s.charAt(i) >= '0' &&
                    s.charAt(i) <= '9') {
                sb.append(s.charAt(i));
                i ++;
            }
            int r = Integer.valueOf(sb.toString());
            switch (operate) {
                case '+':
                    tmp = tmp + r;
                    break;
                case '-':
                    tmp = tmp - r;
                    break;
                case '*':
                    tmp = tmp * r;
                    break;
                case '/':
                    tmp = tmp / r;
                    break;
            }
        }
        System.out.println(tmp);

    }
}


编辑于 2017-04-09 11:29:37 回复(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)
#include<bits/stdc++.h>
usingnamespacestd;
intmain()
{
    string a;
    cin>>a;
    intlen=a.size();
    intsum=a[0]-'0';
    for(inti=1;i<len;i+=2)
    {
        if(a[i]=='-')
        {
            sum-=a[i+1]-'0';
        }
        if(a[i]=='+')
        {
            sum+=a[i+1]-'0';
        }
        if(a[i]=='*')
        {
            sum*=a[i+1]-'0';
        }
    }
    cout<<sum;
    return0;
}
发表于 2021-08-31 19:46:51 回复(0)
#include<bits/stdc++.h>
using namespace std;
int main(){
    char str[20];
    while(scanf("%s",str)!=EOF){
        int num=str[0]-'0';//第一个数字
        for(int i=1;i<strlen(str)-1;i+=2){//遍历所有符号位
            if(str[i]=='+')num+=str[i+1]-'0';
            if(str[i]=='-')num-=str[i+1]-'0';
            if(str[i]=='*')num*=str[i+1]-'0';
        }
        cout<<num<<endl;
    }
    return 0;
}

发表于 2020-02-08 19:02:02 回复(0)
#include<iostream>
#include<string>
using namespace std;
int main()
{
    string s;
    int res;
    cin >> s;
    res = int( s[0])-48;
    int i = 0;
    while (i <= s.length() - 1) {
        if (s[i + 1] == '+') res = res + ( int(s[i + 2])-48);
        if (s[i + 1] == '-') res = res -(int( s[i + 2])-48);
        if (s[i + 1] == '*') res = res * (int(s[i + 2])-48);
        i += 2;
    }
    cout << res;
    return 0;
}
发表于 2019-07-22 11:14:29 回复(0)
import sys


class Solution:
    def eval_express(self, strs):
        stack = list()
        index = 0
        while index < len(strs):
            if strs[index] not in ['+', '-', '*']:
                stack.append(strs[index])
                index += 1
            else:
                num1 = stack.pop()
                rs = eval(str(num1)+strs[index:index+2])
                stack.append(rs)
                index += 2
        print(stack[0])


if __name__ == '__main__':
    args = sys.stdin.readline()
    solution = Solution()
    solution.eval_express(args)


发表于 2018-07-11 14:16:54 回复(0)
import java.util.Collections;
import java.util.Scanner;
import java.util.Stack;

/*
 * 开始看错了题目,虽然有更加简单的方法,但是还是通用的stack解决
 * */

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            String line = scanner.nextLine();
            Stack<Integer> stack = new Stack<>();
            for (int i = 0; i < line.length(); i++) {
                char c = line.charAt(i);
                if (c >= '0' && c <= '9') {
                    int tmp = c - '0';
                    if (stack.isEmpty()) {
                        stack.add(tmp);
                    } else {
                        int ops = stack.pop();
                        int pre = stack.pop();
                        if(ops == 0){
                            tmp+= pre;
                        }else if(ops ==1){
                            tmp = pre - tmp;
                        }else{
                            tmp *= pre;
                        }
                        stack.add(tmp);
                    }
                } else if (c == '+') {
                    stack.add(0);
                } else if (c == '-') {
                    stack.add(1);
                } else if (c == '*') {
                    stack.add(2);
                }
            }
            System.out.println(stack.pop());
        }
    }
}
发表于 2018-04-11 20:38:21 回复(0)
#include <iostream>
#include <string>
using namespace std;
int main()
{
    string s;
    cin>>s;
    int res = s[0]-'0';
    for(int i=2;i<s.size();i+=2) {
        s[i]-='0';
        if(s[i-1]=='+')
            res+=s[i];
        else if(s[i-1]=='-')
            res-=s[i];
        else
            res*=s[i];
    }
    cout<<res;
    return 0;
}
发表于 2018-02-05 23:44:27 回复(0)
Scanner sc = new Scanner(System.in); System.out.println("请输入表达式"); String eqExp = sc.next(); eqExp = eqExp.trim(); int sum = 0; char lastExp = 0; for (int i = 0;i < eqExp.length();i++) {  if (i % 2 == 0) {  int num = Integer.parseInt(eqExp.substring(i,i+1));  if (i == 0 ) {
          sum += num; 
      continue; 
      }  if ('+' == lastExp) {
          sum += num; 
      } else if ('-' == lastExp) {
          sum -= num;
      } else if ('*' == lastExp) {
          sum *= num;    } else {
            System.out.println("表达式有误");  return;    }
     } else {
      lastExp = eqExp.charAt(i);    }
}
System.out.println(sum);

编辑于 2018-01-30 14:21:15 回复(0)
op=list(input())
numbers=list("0123456789")
#转换成int
for i in range(len(op)):
    if op[i] in numbers:
        op[i]=int(op[i])

ans=op[0]
#从第一个开始累计
for i in range(len(op)):
    if op[i] == "+":
        ans+=op[i+1]
    if op[i] == "-":
        ans-=op[i+1]
    if op[i] == "*":
        ans*=op[i+1]

print(ans)


编辑于 2017-08-31 17:13:09 回复(0)