Vijos P1849 表达式求值【有限状态自动机】

来源:互联网 发布:淘宝二手手机可信吗 编辑:程序博客网 时间:2024/05/29 19:01

描述

给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值。

格式

输入格式

输入仅有一行,为需要你计算的表达式,表达式中只包含数字、加法运算符“+”和乘法运算符“*”,且没有括号,所有参与运算的数字均为 0 到 2 ^ 31 -1 之间的整数。输入数据保证这一行只有 0~ 9、+、*这 12 种字符。

输出格式

输出只有一行,包含一个整数,表示这个表达式的值。注意:当答案长度多于 4 位时,请只输出最后 4 位,前导 0 不输出。

样例1

样例输入1

1+1*3+4

样例输出1

8

样例2

样例输入2

1+1234567890*1

样例输出2

7891

样例3

样例输入3

1+1000000003*1

样例输出3

4

限制

每个测试点1s。

提示

样例解释:
样例 1 计算的结果为 8,直接输出 8。
样例 2 计算的结果为 1234567891,输出后 4 位,即 7891。
样例 3 计算的结果为 1000000004,输出后 4 位,即 4。

对于 30%的数据,0≤表达式中加法运算符和乘法运算符的总数≤100;
对于 80%的数据,0≤表达式中加法运算符和乘法运算符的总数≤1000;
对于 100%的数据,0≤表达式中加法运算符和乘法运算符的总数≤100000。

来源

NOIP 2013 普及组



问题链接: Vijos P1849 表达式求值

问题分析

表达式识别是计算机语言程序处理的基本问题。

简单的语法识别可以有限状态自动机来实现。这种方法机械有效,逻辑相对比较简单易懂。

程序说明

有关状态,参见程序代码注释。

题记

语法识别是计算机科学的最基本的话题。


参考链接:(略)


AC的C++程序如下:

#include <iostream>#include <cstdio>using namespace std;/* * status=1 d * status=2 d+ or d* * status=3 d+d * status=4 d+d* * */const int MOD = 10000;int main(){    long long operand1, operand2, operand3, status;    char op1, op2;    scanf("%lld", &operand1);    operand1 %= MOD;    status = 1;    for(;;) {        if(status == 1) {            scanf("%c", &op1);            if(op1 == '+' || op1 == '*')                status = 2;            else                break;        } else if(status == 2) {            scanf("%lld", &operand2);            if(op1 == '*') {                operand1 *= operand2;                operand1 %= MOD;                status = 1;            } else if(op1 == '+')                status = 3;        } else if(status == 3) {            scanf("%c", &op2);            if(op2 == '*')                status = 4;            else if(op2 == '+') {                operand1 += operand2;                operand1 %= MOD;                op1 = op2;                status = 2;            } else {                operand1 += operand2;                operand1 %= MOD;                break;            }        } else if(status == 4) {            scanf("%lld", &operand3);            operand2 *= operand3;            operand2 %= MOD;            status = 3;        } else            break;    }    cout << operand1 << endl;    return 0;}






0 0