Các lượt nộp
    Danh sách bài
    Trang chủ
    Báo lỗi

    solution

    Đề bài: [Trình biên dịch] Trung tố có lũy thừa và trừ một ngôi: chuyển hậu tố và định giá số lớn

    Trình phân tích cú pháp biểu thức (expression parser) của một trình biên dịch phải xử lý đúng nhiều mức độ ưu tiên và cả toán tử một ngôi. Trong bài này, quy ước độ ưu tiên (từ thấp đến cao) là: {+,−}\{+,-\}{+,−} (kết hợp trái) <<< {×,÷}\{\times,\div\}{×,÷} (kết hợp trái) <<< trừ một ngôi <<< ∧\wedge∧ (lũy thừa, kết hợp phải). Nói cách khác, toán tử trừ một ngôi chỉ áp dụng cho một số hạng hoặc một biểu thức trong ngoặc đơn ngay sau nó (được tính trước tiên), sau đó kết quả mới được dùng làm cơ số hoặc số mũ cho phép lũy thừa nếu có; ví dụ −2∧2-2\wedge2−2∧2 được hiểu là (−2)∧2=4(-2)\wedge2=4(−2)∧2=4, khác với −(2∧2)=−4-(2\wedge2)=-4−(2∧2)=−4 (muốn có −4-4−4 phải viết rõ dấu ngoặc).

    Cho một biểu thức trung tố chỉ gồm số nguyên không âm (có thể nhiều chữ số, không có khoảng trắng bên trong một số), dấu ngoặc đơn, toán tử hai ngôi +,−,×,÷,∧+,-,\times,\div,\wedge+,−,×,÷,∧ (viết + - * / ^) và toán tử trừ một ngôi - (đặt ngay trước một số hoặc dấu (). Phép chia ÷\div÷ là chia lấy phần nguyên hướng về 0. Biểu thức có thể chứa khoảng trắng tuỳ ý; số mũ (toán hạng bên phải của ^) trong các bộ test luôn không âm.

    Hãy in ra biểu thức hậu tố tương đương (dùng ký hiệu ~ để biểu diễn toán tử trừ một ngôi, nhằm phân biệt với toán tử trừ hai ngôi -), các token cách nhau đúng một khoảng trắng, và giá trị của biểu thức (là số nguyên, có thể rất lớn, in đầy đủ không giới hạn độ dài, không dùng ký hiệu khoa học).

    Ví dụ: -2^2*3+1 phân tích thành: (−2)∧2=4(-2)\wedge2=4(−2)∧2=4; 4×3=124\times3=124×3=12; 12+1=1312+1=1312+1=13. Hậu tố: 2 ~ 2 ^ 3 * 1 +. Giá trị: 13.

    • Định dạng đầu vào:

      Một dòng chứa biểu thức trung tố (có thể có khoảng trắng tuỳ ý).

    • Định dạng đầu ra:

      Dòng 1: biểu thức hậu tố tương đương (dùng ~ cho trừ một ngôi), các token cách nhau đúng một khoảng trắng. Dòng 2: giá trị nguyên của biểu thức.

    Ví dụ:

    Đầu vào:

    -2^2*3+1

    Đầu ra:

    2 ~ 2 ^ 3 * 1 +
    13
    

    Đầu vào:

    2^3^2

    Đầu ra:

    2 3 2 ^ ^
    512
    

    Đang tải editor...