• POJ1472 Instant Complexity 模拟


    相当于表达式计算一般,用递归进行处理,将BEGIN视作是一个LOOP,每次进入LOOP则进行多条语句处理,知道遇到END位置,结束这个LOOP。

    代码如下:

    #include <iostream>
    #include <cstdlib>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <string>
    #include <map>
    #include <queue>
    #include <vector>
    #include <stack>
    #include <list>
    #include <set>
    using namespace std;
    
    struct EXP {
        int a[11];
        EXP () {
            memset(a, 0, sizeof (a));
        }
        EXP mul(int x) {
            EXP ret;
            if (x == -1) {
                for (int i = 1; i <= 10; ++i) {
                    ret.a[i] = a[i-1];    
                }
            } else {
                for (int i = 0; i <= 10; ++i) {
                    ret.a[i] = x * a[i];    
                }    
            }
            return ret;
        }
        EXP add(int x) {
            EXP ret = *this;
            ret.a[0] += x;
            return ret;
        }
        EXP add(EXP x) {
            EXP ret = *this;
            for (int i = 0; i <= 10; ++i) {
                ret.a[i] += x.a[i];    
            }
            return ret;
        }
    };
    
    EXP cal() {
        EXP ret;
        char op[20], num[20]; 
        while (1) {
            scanf("%s", op);
            if (!strcmp(op, "LOOP")) {
                scanf("%s", num);
                if (num[0] == 'n') {
                    ret = ret.add(cal().mul(-1));
                } else {
                    ret = ret.add(cal().mul(atoi(num)));
                }
            } else if (!strcmp(op, "OP")) {
                scanf("%s", num);
                ret = ret.add(atoi(num));
            } else return ret;
        }
    }
    
    int main()
    {
        int T, ca = 0;
        char coat[20];
        bool first, zero;
        EXP ret;
        scanf("%d", &T);
        while (T--) {
            first = zero = true;
            scanf("%s", coat);
            ret = cal();
            printf("Program #%d\n", ++ca);
            printf("Runtime = ");
            for (int i = 0; i <= 10; ++i) {
                if (ret.a[i]) zero = false;
            }
            if (zero) {
                puts("0\n");
                continue;    
            }
            for (int i = 10; i >= 0; --i) {
                if (ret.a[i]) {
                    if (ret.a[i] == 1) {
                        if (first) {
                            if (i) {
                                if (i == 1) {
                                    printf("n");
                                } else {
                                    printf("n^%d", i);
                                }
                            } else { 
                                printf("1");
                            }
                            first = false;
                        } else {
                            if (i) {
                                if (i == 1) {
                                    printf("+n");
                                } else {
                                    printf("+n^%d", i);
                                }
                            } else { 
                                printf("+1");
                            }
                        }
                    } else { // ret.a[i] != 1
                        if (first) {
                            if (i) {
                                if (i == 1) {
                                    printf("%d*n", ret.a[i]);
                                } else {
                                    printf("%d*n^%d", ret.a[i], i);
                                }
                            } else {
                                printf("%d", ret.a[i]);
                            }
                            first = false;
                        } else {
                            if (i) {
                                if (i == 1) {
                                    printf("+%d*n", ret.a[i]);
                                } else {
                                    printf("+%d*n^%d", ret.a[i], i);
                                }
                            } else {
                                printf("+%d", ret.a[i]);
                            }
                        }
                    }
                }    
            }
            puts("\n");
        }
        return 0;
    }
  • 相关阅读:
    建议使用nullptr而不是NULL
    二叉树的遍历(三种遍历方式,前中后序;递归,栈,迭代实现)
    455.分发饼干Easy Leetcode
    java 报错:Implicit super constructor Point() is undefined. Must explicitly invoke another constructor
    求解字符串所包含子串的个数
    数组去重
    vue watch
    mysql设置指定字段不能为负数
    Shell脚本监控服务存活状态及异常,并触发钉钉webhook报警
    Shell常用语法
  • 原文地址:https://www.cnblogs.com/Lyush/p/2683898.html
Copyright © 2020-2023  润新知