Bài 1. Thẩm định (OLP MT&TN lần 7)
Xem PDFĐể quản lý các dịch vụ công trực tuyến một cách an toàn, thành phố Đà Nẵng triển khai cấp mã số định danh (City ID) cho người dân. Nhằm ngăn chặn các trường hợp nhập sai số hoặc làm giả ID, hệ thống sử dụng Thuật toán Luhn để xác thực mã số.
Một chuỗi mã ID có hai trạng thái là Hợp Lệ hoặc Vô Hiệu (không thể sử dụng). Việc kiểm tra ID hợp lệ dựa trên những quy tắc sau:
- Chuỗi chỉ được phép chứa chữ số (từ
0đến9), khoảng trắng () và dấu gạch nối (-). Nếu có bất kỳ ký tự nào khác, mã ID là Vô Hiệu. - Sau khi loại bỏ toàn bộ khoảng trắng và dấu gạch nối, chuỗi phải còn lại ít nhất \(1\) chữ số. Nếu rỗng, mã ID Vô Hiệu.
- Với dãy chữ số còn lại, đánh số vị trí từ phải sang trái (chữ số hàng đơn vị là vị trí thứ \(1\)):
- Các chữ số ở vị trí lẻ (\(1, 3, 5, \dots\)) giữ nguyên giá trị.
- Các chữ số ở vị trí chẵn (\(2, 4, 6, \dots\)) được nhân đôi. Nếu kết quả lớn hơn \(9\), đem trừ cho \(9\) (Ví dụ: \(7 \cdot 2 = 14 \rightarrow 14 - 9 = 5\)).
- Tính tổng tất cả các chữ số (cả giữ nguyên và đã biến đổi). Nếu tổng này chia hết cho \(10\), mã ID Hợp Lệ. Ngược lại là Vô Hiệu.
Yêu cầu: Cho một xâu \(S\) do người dùng nhập vào. Hãy kiểm tra xem xâu này có phải là mã định danh hợp lệ theo thuật toán Luhn hay không?
Input
- Một dòng duy nhất chứa xâu \(S\) (\(1 \le |S| \le 100\)).
Output
- In ra
YESnếu xâu \(S\) là một mã ID hợp lệ. Ngược lại in raNO.
Example
Test 1
Input
4532-1234-5678-9014
Output
YES
Note
- Dãy số sau khi lọc:
4532123456789014(Độ dài \(16\)). - Quét từ phải sang trái, nhân đôi các vị trí chẵn (và trừ \(9\) nếu cần):
- Mảng gốc:
4 5 3 2 1 2 3 4 5 6 7 8 9 0 1 4 - Biến đổi:
8 5 6 2 2 2 6 4 1 6 5 8 9 0 2 4 - Tổng \(= 70\). Vì \(70\) chia hết cho \(10\), mã ID hợp lệ.
Test 2
Input
7992 7398 71 3
Output
YES
Note
Dãy số sau khi lọc: 79927398713 (Độ dài \(11\)). Tổng các chữ số sau khi áp dụng thuật toán Luhn là \(70\), chia hết cho \(10 \rightarrow\) YES.
Test 3
Input
4532 abc 9014
Output
NO
Note
Chuỗi chứa các ký tự chữ cái a, b, c, vi phạm ngay lập tức quy tắc 1.
Test 4
Input
1234
Output
NO
Note
Chuỗi chỉ gồm chữ số, hợp lệ về ký tự và không rỗng sau khi lọc. Tuy nhiên, áp dụng thuật toán Luhn: tổng \(= 4 + (3 \cdot 2) + 2 + (1 \cdot 2) = 4 + 6 + 2 + 2 = 14\), không chia hết cho \(10 \rightarrow\) NO.
Scoring
- Subtask \(1\) (\(50\) điểm): Xâu \(S\) chỉ chứa các chữ số và luôn có độ dài chẵn.
- Subtask \(2\) (\(50\) điểm): Không có ràng buộc gì thêm.
Bình luận (6)