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] Tách token biểu thức có ký hiệu mũ khoa học

    Cho một dòng biểu thức số học EEE chỉ gồm: các chữ số 0-9, dấu chấm thập phân ., ký hiệu mũ khoa học e hoặc E (có thể kèm dấu +/- ngay sau), các toán tử + - * /, dấu ngoặc ( ), và có thể xen kẽ khoảng trắng tuỳ ý (khoảng trắng bị loại bỏ hoàn toàn trước khi tách token, không mang ý nghĩa gì).

    Hãy xây dựng bộ tách token (tokenizer) theo nguyên tắc so khớp dài nhất (maximal munch): tại mỗi vị trí, nếu ký tự hiện tại là chữ số, hãy nuốt (consume) chuỗi dài nhất khớp với biểu thức chính quy của một số hợp lệ: digit+( . digit+)? ([eE][+−]?digit+)?\text{digit}^+(\,.\,\text{digit}^+)?\,([eE][+-]?\text{digit}^+)?digit+(.digit+)?([eE][+−]?digit+)? (phần nguyên bắt buộc, phần thập phân tuỳ chọn, phần mũ khoa học tuỳ chọn). Ngược lại, mỗi ký tự trong + - * / ( ) là một token toán tử/dấu ngoặc riêng biệt.

    Với mỗi token số, hãy tính giá trị số thực của nó (diễn giải theo cú pháp số thực Python, ví dụ 2e2 = 200200200) rồi in ra với đúng 6 chữ số thập phân (định dạng %.6f).

    Đề bài đảm bảo đầu vào không có số bắt đầu bằng dấu chấm, và mọi dấu +/- không nằm ngay sau e/E của một số đều là toán tử độc lập.

    Ví dụ: Input 12+3.5*(2e2-1) → Output 9 dòng:

    NUMBER 12.000000
    PLUS
    NUMBER 3.500000
    TIMES
    LPAREN
    NUMBER 200.000000
    MINUS
    NUMBER 1.000000
    RPAREN
    
    • Định dạng đầu vào:

      Một dòng duy nhất chứa biểu thức EEE (độ dài từ 1 đến 300 ký tự, có thể chứa khoảng trắng xen kẽ).

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

      In ra danh sách token, mỗi token một dòng, theo đúng thứ tự xuất hiện. Với token số in NUMBER value (value định dạng %.6f); với các token còn lại in đúng một trong các nhãn PLUS, MINUS, TIMES, DIVIDE, LPAREN, RPAREN tương ứng + - * / ( ).

    Ví dụ:

    Đầu vào:

    12+3.5*(2e2-1)
    

    Đầu ra:

    NUMBER 12.000000
    PLUS
    NUMBER 3.500000
    TIMES
    LPAREN
    NUMBER 200.000000
    MINUS
    NUMBER 1.000000
    RPAREN
    

    Đầu vào:

    0
    

    Đầu ra:

    NUMBER 0.000000
    

    Đang tải editor...