Hướng dẫn giải của [VT Thiếu nhi] BÀI 29: TINH1


Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.

Hướng dẫn giải

Cho biểu thức chỉ gồm các phép cộng (+), trừ (-) và các toán hạng là chữ số 0..9, có khoảng trắng giữa các toán tử và toán hạng. Tính giá trị biểu thức.

Ví dụ: "1 + 9 - 4" có kết quả 6.

Sub 1: Vét cạn — ~O(n)~

Tách biểu thức thành từng token (toán tử hoặc toán hạng), rồi duyệt từ trái sang phải: gặp toán tử thì ghi nhớ dấu, gặp toán hạng thì cộng hoặc trừ vào kết quả. Đạt 20/20 test.

#include <bits/stdc++.h>
using namespace std;

int main() {
    freopen("TINH1.INP", "r", stdin);
    freopen("TINH1.OUT", "w", stdout);
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    // Vét cạn: đọc từng từ (toán tử hoặc toán hạng) rồi tính lần lượt từ trái sang phải
    vector<string> tok;
    string t;
    while (cin >> t) tok.push_back(t);
    long long res = 0;
    char op = '+';
    for (auto &w : tok) {
        if (w == "+" || w == "-") {
            op = w[0];
        } else {
            long long v = stoll(w);
            if (op == '+') res += v;
            else res -= v;
        }
    }
    cout << res << '\n';
    return 0;
}
Sub 2: Duyệt từng ký tự — ~O(n)~

Đọc cả dòng và duyệt từng ký tự. Dấu '+' đặt dấu hiện tại là +1, dấu '-' đặt là -1; mỗi chữ số cộng dấu × chữ số vào kết quả. Khoảng trắng bị bỏ qua tự nhiên. Đạt 20/20 test.

#include <bits/stdc++.h>
using namespace std;

int main() {
    freopen("TINH1.INP", "r", stdin);
    freopen("TINH1.OUT", "w", stdout);
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    // Đọc cả dòng, bỏ qua khoảng trắng; gặp '+' thì dấu là +, gặp '-' thì dấu là -
    string s, line;
    while (getline(cin, line)) s += line;
    long long res = 0;
    int sign = 1;
    for (char c : s) {
        if (c == '+') sign = 1;
        else if (c == '-') sign = -1;
        else if (isdigit(c)) res += sign * (c - '0');
    }
    cout << res << '\n';
    return 0;
}

Bình luận

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.