Giải Tin Học 10 trang 150

Lời giải chi tiết SGK Lớp 10 · Môn Tin Học · Trang 150–151

Mục tiêu bài học

Sau bài này em sẽ:

  • Thực hành viết chương trình đơn giản bằng ngôn ngữ Python.
  • Thực hành các bước gỡ rối (debug) chương trình: thiết lập điểm dừng và chạy theo từng lệnh.

Nhiệm vụ 1: Kiểm tra số nguyên tố và phân tích thừa số nguyên tố

Đề bài

Viết chương trình nhập từ bàn phím số tự nhiên n, kiểm tra n có phải là số nguyên tố hay không. Nếu n là hợp số thì in ra kết quả phân tích n thành tích các thừa số nguyên tố. Chú ý: số 1 không là nguyên tố và cũng không là hợp số.

Ý tưởng (Hướng dẫn)

Dùng danh sách NT để lưu các thừa số nguyên tố của n:

Trường hợpKết quả
n = 1Danh sách NT rỗng → thông báo không là số nguyên tố
n > 1len(NT) == 1nsố nguyên tố
n > 1len(NT) > 1nhợp số, in dạng $n = p_1 \times p_2 \times ... \times p_k$

Chương trình mẫu phantichnt.py

# Nhập số tự nhiên từ bàn phím và kiểm tra n có phải là số nguyên tố hay không.
# Nếu n = 1 thì thông báo n không phải là số nguyên tố.
# Nếu n là hợp số thì in ra phân tích n thành tích các thừa số nguyên tố.
n = int(input("Nhập số tự nhiên n: "))
m = n
k = 2
NT = []
while m > 1:
    while m % k != 0:
        k = k + 1
    NT.append(k)
    m = m // k
count = len(NT)
if count == 0:
    print(n, "không là số nguyên tố")
elif count == 1:
    print(n, "là số nguyên tố")
else:
    print(n, "là hợp số")
    print(n, "=", end=" ")
    for i in range(count):
        if i < count - 1:
            print(NT[i], "x", end=" ")
        else:
            print(NT[i])

Giải thích từng bước

  • m = n: dùng biến phụ m để xử lý, giữ nguyên n để in kết quả.
  • k = 2: bắt đầu thử chia từ số nguyên tố nhỏ nhất.
  • Vòng while m > 1: lặp đến khi m rút gọn về 1.
  • Vòng while m % k != 0: k = k + 1: tăng k đến khi tìm được ước nhỏ nhất của m. Ước nhỏ nhất luôn là số nguyên tố.
  • NT.append(k): thêm thừa số đó vào danh sách.
  • m = m // k: chia m cho thừa số vừa tìm để tiếp tục phân tích.
  • count = len(NT): đếm số thừa số tìm được.
  • count == 0n = 1 → không nguyên tố, không hợp số.
  • count == 1 → chỉ có một thừa số → n chính là số nguyên tố.
  • count > 1 → có nhiều thừa số → n là hợp số, in khai triển.

Mẹo hiểu nhanh: Khi vòng lặp chỉ tìm được đúng 1 thừa số (là chính n), nghĩa là n không chia hết cho số nào nhỏ hơn → đó là số nguyên tố.


Phần gỡ rối (Debug) – Trang 150

Cách thiết lập điểm dừng

Đặt một điểm dừng (breakpoint) tại dòng 20 – ngay trước lệnh m = m // k. Vì sao chọn vị trí này? Vì sau khi k (ước nguyên tố tiếp theo) được tìm thấy và thêm vào NT, ta muốn quan sát giá trị các biến n, m, k xem có đúng theo thuật toán không, trước khi m bị thay đổi.

Khi chạy:

  • Chương trình dừng lại trước dòng có điểm dừng (dòng được tô màu/đánh dấu).
  • Nhấn nút ▶ (Continue) để chạy tiếp đến lần dừng kế tiếp.
  • Trong cửa sổ Variable, em quan sát được các biến (ví dụ: k = 5, m = 25, n = 100).

Bảng theo dõi giá trị trung gian với n = 100

kmnNTKết thúc
2100100[2]
250100[2, 2]
525100[2, 2, 5]
55100[2, 2, 5, 5]
Thông báo: 100 = 2 × 2 × 5 × 5

Đọc bảng: Mỗi lần dừng, m giảm dần (100 → 50 → 25 → 5 → 1), còn NT được bổ sung dần. Cuối cùng m = 1 nên vòng lặp kết thúc, kết quả: $100 = 2 \times 2 \times 5 \times 5$. Việc lập bảng giúp em kiểm tra thuật toán chạy đúng từng bước.


Nhiệm vụ 2: Giải phương trình bậc hai

Đề bài

Viết chương trình nhập từ bàn phím ba số thực a, b, c và tìm nghiệm của phương trình bậc hai:

$$ax^2 + bx + c = 0$$

Chương trình cần xét đầy đủ các trường hợp xảy ra.

Phân tích các trường hợp (Hướng dẫn)

Trang sách dừng ở phần dẫn nhập. Thầy hệ thống đầy đủ các trường hợp cần xét để em làm tiếp:

Trường hợp 1: a = 0 (không còn là phương trình bậc hai, trở thành bx + c = 0)

  • Nếu b = 0c = 0: phương trình vô số nghiệm.
  • Nếu b = 0c ≠ 0: phương trình vô nghiệm.
  • Nếu b ≠ 0: phương trình có một nghiệm $x = -\dfrac{c}{b}$.

Trường hợp 2: a ≠ 0 (phương trình bậc hai thực sự), tính $\Delta = b^2 - 4ac$:

  • $\Delta < 0$: vô nghiệm (thực).
  • $\Delta = 0$: nghiệm kép $x = -\dfrac{b}{2a}$.
  • $\Delta > 0$: hai nghiệm phân biệt $x_{1,2} = \dfrac{-b \pm \sqrt{\Delta}}{2a}$.

Chương trình tham khảo

# Giải phương trình bậc hai ax^2 + bx + c = 0
a = float(input("Nhập a: "))
b = float(input("Nhập b: "))
c = float(input("Nhập c: "))

if a == 0:
    if b == 0:
        if c == 0:
            print("Phương trình vô số nghiệm")
        else:
            print("Phương trình vô nghiệm")
    else:
        print("Phương trình có nghiệm x =", -c / b)
else:
    delta = b * b - 4 * a * c
    if delta < 0:
        print("Phương trình vô nghiệm")
    elif delta == 0:
        print("Phương trình có nghiệm kép x =", -b / (2 * a))
    else:
        x1 = (-b + delta ** 0.5) / (2 * a)
        x2 = (-b - delta ** 0.5) / (2 * a)
        print("Phương trình có hai nghiệm:")
        print("x1 =", x1)
        print("x2 =", x2)

Giải thích: Mấu chốt là phải kiểm tra a == 0 trước, vì nếu a = 0 thì công thức $\Delta$ và chia 2a sẽ không còn ý nghĩa (chia cho 0). Đây chính là lý do đề nhắc "cần xét đầy đủ các trường hợp".


Tóm lại, bài này luyện cho em hai kỹ năng: viết chương trình có nhiều nhánh điều kiện (if/elif/else) và biết dùng debug để theo dõi biến từng bước. Nếu em muốn thầy giải thích thêm về cách dùng công cụ debug cụ thể trong một phần mềm (như IDLE hay PyCharm), cứ nói nhé.

Chế độ đọc sách →