Bài 1. Thẩm định (OLP MT&TN lần 7)

Xem PDF



Tác giả:
Dạng bài
Ngôn ngữ cho phép
Assembly, Awk, C, C#, C++, Clang, Cobol, D, Groovy, Haskell, JS, Java, Kotlin, Lua, Node JS, OCaml, ObjectiveC, Output, PHP, Pascal, Perl, Prolog, Pypy, Pypy 3, Python, Ruby, Rust, Scala, Scratch, Swift
Điểm: 900 (p) Thời gian: 1.0s Bộ nhớ: 256M Input: bàn phím Output: màn hình

Để 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:

  1. Chuỗi chỉ được phép chứa chữ số (từ 0 đến 9), 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.
  2. 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.
  3. 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 YES nếu xâu \(S\) là một mã ID hợp lệ. Ngược lại in ra NO.

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)

Mới nhất
Tải bình luận...