C6-17 · Tìm lỗi: bỏ các số chẵn
Xem dạng PDFĐề
Bài toán: đọc một dãy số nguyên (có ít nhất một số lẻ), bỏ mọi số chẵn, in các số còn lại theo thứ tự ban đầu.
Một bạn đã viết chương trình dưới đây. Với dữ liệu 5 / 2 4 5 6 7, kết quả đúng là 5 7 nhưng chương trình in 4 5 7.
n = int(input())
ds = list(map(int, input().split()))
for x in ds:
if x % 2 == 0:
ds.remove(x)
print(*ds)
Hãy lập bảng vết như ở mục 6.10 để thấy vì sao số 4 bị sót, sửa chương trình bằng mẫu lọc của mục 6.5.2, rồi nộp bản đã sửa. Bản nộp được chấm như một bài bình thường theo đề trên.
Dữ liệu vào
- Dòng 1: số nguyên ~n~.
- Dòng 2: ~n~ số nguyên, cách nhau một dấu cách; có ít nhất một số lẻ.
Kết quả
Một dòng: các số lẻ của dãy theo thứ tự ban đầu, cách nhau một dấu cách.
Ràng buộc
- ~1 \le n \le 100~.
- Mỗi số nằm trong ~[-10^9;\ 10^9]~.
Ví dụ
Dữ liệu vào:
5
2 4 5 6 7
Kết quả:
5 7
Giải thích ví dụ
Bảng vết của chương trình lỗi với ds = [2, 4, 5, 6, 7] (vòng for giữ một vị trí ngầm tăng dần):
| Lần lặp | Vị trí ngầm | x |
Việc làm | ds sau đó |
|---|---|---|---|---|
| 1 | 0 | 2 | chẵn, xóa; các phần tử sau dồn lên | [4, 5, 6, 7] |
| 2 | 1 | 5 | lẻ, giữ (số 4 đã dồn về vị trí 0, bị bỏ qua) | [4, 5, 6, 7] |
| 3 | 2 | 6 | chẵn, xóa | [4, 5, 7] |
| — | 3 | — | bằng len(ds), dừng |
[4, 5, 7] |
Bản sửa không xóa trên danh sách đang duyệt mà lọc ra danh sách mới: các số lẻ là 5 7.
Lưu ý
- Lỗi chỉ lộ khi hai số chẵn đứng liền nhau; với
2 5 4chương trình lỗi vẫn in đúng5. Bộ test có nhiều chuỗi số chẵn liền nhau, ở đầu, giữa và cuối dãy. - Duyệt chỉ số
for i in range(n)rồidel ds[i]cũng sai: danh sách ngắn đi, chỉ số vượt quá cuối. - Số 0 và số chẵn âm cũng phải bỏ; trong Python
-3 % 2 == 1, nênx % 2 != 0nhận đúng mọi số lẻ.
Nguồn trong sách: Bài C6-17, mục 6.12, giáo trình Lập trình cơ sở với Python — TS. Nguyễn Quốc Long · Mức: (**)