CCF 201903-2 二十四点

[TOC]

题目描述

image.png

解题思路

这道题就是很简单的计算题目,可以用两种方式:栈、循环遍历
实际上,CCF的第二题基本上都不是考什么算法,使用栈来实现虽然泛用性更高却未必更简单。个人认为直接遍历两遍:先乘除后加减即可。
但是我代码却还是用的是栈,毕竟当初写代码的时候把事情想得太复杂了。

代码

#include <fstream>
#include <iostream>
#include <stack>

using namespace std;
int main() {
    char data[10];
    int n;
    // fstream cin("D:/Codes/C_Code/Algorithm/CCF/201903-2.dat");
    cin >> n;
    // getchar();
    int v1 = -1, v2 = -1, last, ans[20], pos;
    char op;
    for (int i = 0; i < n; i++) {
        pos = 0;
        cin >> data;
        // cout << data << endl;
        v1 = data[0] - '0';
        ans[pos++] = v1;
        for (int j = 1; j < 6; j += 2) {
            op = data[j];
            v2 = data[j + 1] - '0';
            if (op == 'x' || op == '/') {
                v1 = ans[--pos];
                if (op == 'x')
                    ans[pos++] = v1 * v2;
                else
                    ans[pos++] = v1 / v2;
            } else {
                ans[pos++] = op;
                ans[pos++] = v2;
            }
        }
        last = 0;
        while (last < pos - 1 && pos > 2) {
            v1 = ans[last++];
            op = ans[last++];
            v2 = ans[last++];
            if (op == '+') {
                ans[--last] = v1 + v2;
            } else
                ans[--last] = v1 - v2;
        }
        v1 = ans[last];

        if (v1 == 24) {
            cout << "Yes" << endl;
            
        } else {
            cout << "No" << endl;
        }
    }
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容