Cho một dòng biểu thức số học E 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+)?
(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 = 200) 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
Một dòng duy nhất chứa biểu thức E (độ dài từ 1 đến 300 ký tự, có thể chứa khoảng trắng xen kẽ).
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...