NZEC (Non-Zero Exit Code): Mã thoát khác 0, báo hiệu chương trình kết thúc bất thường (runtime error). Exit code 0 = thành công.
Nguyên nhân phổ biến
- Truy cập index âm hoặc vượt giới hạn mảng.
- Vượt bộ nhớ (Memory Limit Exceeded).
- Đệ quy vô tận hoặc stack overflow.
- Chia cho 0 (
ZeroDivisionError). - Input/output không khớp format yêu cầu (competitive programming).
- Biến bị overflow (hiếm trong Python do int unbounded).
- Tính giai thừa lớn (>20) không dùng thuật toán tối ưu.
Xử lý với try-except
try:
# code có thể gây lỗi
except Exception as e:
# log hoặc xử lý
pass # hoặc sys.exit(1)
Ví dụ 1: Đọc input sai/correct
# Sai: input() trả về string, map(int, ...) không tách được x, y = map(int, input()) # ValueError nếu nhập "1 2" # Đúng: tách bằng split() x, y = map(int, input().split()) # "1 2" -> ['1','2'] -> (1,2)
Ví dụ 2: Đọc mảng số nguyên
# Sai: vòng lặp input() từng dòng - chậm, dễ NZEC nếu EOF
for i in range(n):
x = int(input())
arr.append(x)
# Đúng: đọc cả dòng, split, map
arr = list(map(int, input().split()))
# Hoặc list comprehension
arr = [int(k) for k in input().split()]
Checklist debug NZEC (Competitive Programming)
- Kiểm tra edge cases: n=0, n=1, input rỗng, số lớn.
- Đảm bảo output format chính xác (không thừa space, newline).
- Tránh đệ quy sâu -> dùng vòng lặp hoặc tăng
sys.setrecursionlimit(). - Kiểm tra chia cho 0.
- Dùng
sys.stdin.read().split()đọc toàn bộ input nhanh hơn. - Test với sample input/output chính xác.
Template an toàn cho CP
import sys
def solve():
data = sys.stdin.read().split()
if not data:
return
it = iter(data)
# parse data từ iterator it
# print kết quả
if __name__ == "__main__":
solve()