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] Định giá chính xác biểu thức có dấu trừ một ngôi và lũy thừa

    Xây dựng một bộ định giá biểu thức (expression evaluator) hoàn chỉnh cho một ngôn ngữ nhỏ có: số nguyên không âm, các toán tử hai ngôi +,−,×,÷, ^+, -, \times, \div, \hat{\ }+,−,×,÷, ^ (+ - * / ^), dấu ngoặc ( ), và dấu trừ một ngôi (unary minus, ví dụ -3, -(1+2)).

    Quy ước độ ưu tiên (từ cao xuống thấp):

    1. ^ (lũy thừa) — kết hợp phải;
    2. dấu trừ một ngôi (unary -) — áp dụng cho toán hạng ngay sau nó theo cùng quy tắc kết hợp phải, và có độ ưu tiên thấp hơn ^ nhưng cao hơn *, / (giống quy ước của Python: -2**2 =−4= -4=−4, không phải 444; còn 2**-3 =2−3= 2^{-3}=2−3);
    3. *, / — kết hợp trái;
    4. +, - (hai ngôi) — kết hợp trái, thấp nhất.

    Số mũ (toán hạng bên phải của ^) luôn được đảm bảo định giá ra một số nguyên (có thể âm). Phép chia /, và phép lũy thừa với số mũ âm của cơ số 0, đều phải tính chính xác bằng phân số (không dùng số thực dấu phẩy động) để tránh sai số.

    Nếu tại bất kỳ bước nào xảy ra chia cho 0 (kể cả 000 mũ một số nguyên âm), in ra KHONG XAC DINH và dừng.

    Ví dụ: 2^-3 được hiểu là 2−3=182^{-3} = \dfrac{1}{8}2−3=81​.

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

      Một dòng chứa biểu thức, có thể có hoặc không có khoảng trắng, gồm các chữ số, các ký tự + - * / ^ ( ). Chỉ dấu - đứng ở đầu biểu thức, ngay sau (, hoặc ngay sau một toán tử khác mới là dấu trừ một ngôi; các trường hợp còn lại là toán tử trừ hai ngôi.

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

      Nếu kết quả là số nguyên, in ra số nguyên đó. Nếu kết quả là phân số không nguyên, in ra dưới dạng p/q tối giản với q>0q>0q>0 (dấu âm nếu có được đặt ở tử số ppp). Nếu có chia cho 0 (bao gồm lũy thừa âm của cơ số 0), in ra đúng chuỗi KHONG XAC DINH.

    Ví dụ:

    Đầu vào:

    3+4*2

    Đầu ra:

    11
    

    Đầu vào:

    -2^2

    Đầu ra:

    -4
    

    Đang tải editor...