C6-17 · Tìm lỗi: bỏ các số chẵn

Xem dạng PDF

Gửi bài giải

Điểm: 1,00
Giới hạn thời gian: 1.0s
Giới hạn bộ nhớ: 256M
Input: stdin
Output: stdout

Tác giả:
Nguồn bài:
Sách "Lập trình cơ sở với Python"
Dạng bài
Ngôn ngữ cho phép
Python

Đề

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 4 chương trình lỗi vẫn in đúng 5. 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ồi del 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ên x % 2 != 0 nhậ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: (**)


Đang tải...