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


    描述

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

    格式

    输入格式

    输入仅有一行,为需要你计算的表达式,表达式中只包含数字、加法运算符“+”和乘法运算符“*”,且没有括号,所有参与运算的数字均为 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;
    }






  • 相关阅读:
    函数节流throttle和防抖debounce
    用RecyclerView做一个小清新的Gallery效果
    JavaScript之三
    vue介绍
    water
    吴裕雄--天生自然 R语言开发学习:基本统计分析
    吴裕雄--天生自然 R语言开发学习:基本图形(续三)
    吴裕雄--天生自然 R语言开发学习:基本图形(续二)
    吴裕雄--天生自然 R语言开发学习:基本图形(续一)
    吴裕雄--天生自然 R语言开发学习:基本图形
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7563817.html
Copyright © 2020-2023  润新知