Bỏ qua để đến nội dung

Số nguyên tố

Mức độ: Cơ bản

Số nguyên tố là chủ đề xuất hiện nhiều nhất trong đề thi học sinh giỏi Tin học: kiểm tra số nguyên tố, đếm số nguyên tố, phân tích thừa số nguyên tố, số siêu nguyên tố… Bài này dùng lại ý “ước đi theo cặp” của bài Ước và bội, các bạn nên học bài đó trước.

Số nguyên tố là số tự nhiên lớn hơn 1 và chỉ có đúng hai ước: 1 và chính nó. Các số nguyên tố đầu tiên là 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, …

  • 1 không phải số nguyên tố (chỉ có một ước).
  • 2 là số nguyên tố chẵn duy nhất: mọi số chẵn khác đều chia hết cho 2.
  • Số lớn hơn 1 mà không phải số nguyên tố gọi là hợp số, ví dụ 4, 6, 9, 91.

Muốn biết n có phải số nguyên tố không, ta tìm xem n có ước nào từ 2 đến n - 1 hay không. Nhưng không cần thử hết: theo bài Ước và bội, nếu n = a × b với a ≤ b thì a ≤ √n. Vậy nếu n có ước (khác 1 và n) thì chắc chắn có một ước không vượt quá √n. Chỉ cần thử d từ 2 đến √n.

nThử d = 2, 3, … với d × d ≤ nKết luận
912, 3, 4, 5, 6 không chia hết; 91 = 7 × 13hợp số
972, 3, …, 9 đều không chia hết (10 × 10 = 100 > 97)nguyên tố
def la_nguyen_to(n):
if n < 2:
return False # 0 và 1 không phải số nguyên tố
d = 2
while d * d <= n:
if n % d == 0:
return False # tìm được ước, là hợp số
d += 1
return True
print(la_nguyen_to(91), la_nguyen_to(97)) # False True

Với n tới 1012, vòng lặp chạy nhiều nhất 106 lần, rất nhanh.

Lưu ý: nhớ trường hợp n = 0 và n = 1. Thiếu dòng if n < 2 thì vòng lặp không chạy lần nào và hàm trả về True, coi 1 là số nguyên tố.

Nhanh gấp đôi: sau khi thử d = 2, chỉ cần thử các số lẻ 3, 5, 7, … vì nếu n không chia hết cho 2 thì cũng không chia hết cho số chẵn nào.

Mọi số lớn hơn 1 đều viết được thành tích các số nguyên tố, và chỉ có một cách viết (không kể thứ tự). Ví dụ 360 = 23 × 32 × 5.

Cách làm: thử d = 2, 3, 4, … Gặp d mà n chia hết cho d thì chia n cho d nhiều lần nhất có thể, đếm số lần chia. Chạy tay với 360:

dChia liên tiếpSố lầnn còn lại
2360 → 180 → 90 → 45345
345 → 15 → 525
44 × 4 > 5, dừng5

Sau vòng lặp n còn 5 (lớn hơn 1) nên 5 là thừa số nguyên tố cuối cùng. Kết quả 360 = 23 × 32 × 5.

Vì sao d = 4 không bao giờ chia hết? Vì lúc tới d = 4, mọi thừa số 2 đã bị chia hết ra rồi. Nên mỗi khi n chia hết cho d thì d chắc chắn là số nguyên tố, không cần kiểm tra.

n = int(input())
d = 2
while d * d <= n:
so_mu = 0
while n % d == 0:
n //= d
so_mu += 1
if so_mu > 0:
print(d, so_mu) # thừa số d với số mũ so_mu
d += 1
if n > 1:
print(n, 1) # phần còn lại là một số nguyên tố

Lưu ý: điều kiện vòng lặp d * d <= n dùng n đang giảm dần, nên vòng lặp dừng sớm. Đừng quên phần if n > 1 ở cuối: với n = 26 = 2 × 13, sau khi chia n cho 2 thì n = 13, vòng lặp dừng ở d = 4 và 13 chỉ được in ra nhờ dòng này.

Mỗi ước của 360 = 23 × 32 × 5 có dạng 2a × 3b × 5c, trong đó:

  • a chọn từ 0 đến 3: 4 cách,
  • b chọn từ 0 đến 2: 3 cách,
  • c chọn từ 0 đến 1: 2 cách.

Số ước là 4 × 3 × 2 = 24. Quy tắc chung: cộng 1 vào mỗi số mũ rồi nhân lại.

n! (đọc là n giai thừa) là tích 1 × 2 × 3 × … × n. Mỗi chữ số 0 tận cùng ứng với một thừa số 10 = 2 × 5. Thừa số 2 luôn nhiều hơn thừa số 5, nên số chữ số 0 tận cùng bằng số thừa số 5 trong n!.

Đếm thừa số 5 trong 100!:

  • Các số chia hết cho 5 (5, 10, …, 100) góp mỗi số một thừa số 5: 100 // 5 = 20.
  • Các số chia hết cho 25 (25, 50, 75, 100) góp thêm một thừa số 5 nữa: 100 // 25 = 4.
  • 125 > 100, dừng.

100! có 20 + 4 = 24 chữ số 0 tận cùng, tính được mà không cần nhân ra số có 158 chữ số.

Gồm 21 bài, chia thành 4 nhóm từ dễ đến khó. Mỗi bài có một dữ liệu kiểm tra: các bạn chạy chương trình của mình với dữ liệu đó rồi so với đáp số.

Nhập số nguyên n (0 ≤ n ≤ 1012). In ra YES nếu n là số nguyên tố, ngược lại in ra NO.

Ví dụ: nhập 97 thì in ra YES.

Kiểm tra: nhập 1000000007.

Xem đáp số

YES

Hướng dẫn giải chi tiết: liên hệ tác giả.

Nhập số nguyên dương n (n ≤ 1012). In ra số nguyên tố nhỏ nhất lớn hơn hoặc bằng n.

Ví dụ: nhập 20 thì in ra 23.

Kiểm tra: nhập 1000000.

Xem đáp số

1000003

Hướng dẫn giải chi tiết: liên hệ tác giả.

Bài 3. Số nguyên tố lớn nhất không vượt quá n

Phần tiêu đề “Bài 3. Số nguyên tố lớn nhất không vượt quá n”

Nhập số nguyên n (2 ≤ n ≤ 1012). In ra số nguyên tố lớn nhất nhỏ hơn hoặc bằng n.

Ví dụ: nhập 20 thì in ra 19.

Kiểm tra: nhập 1000000000000.

Xem đáp số

999999999989

Hướng dẫn giải chi tiết: liên hệ tác giả.

Nhập số nguyên dương n (n ≤ 104). In ra các số nguyên tố không vượt quá n theo thứ tự tăng dần, cách nhau một dấu cách. Nếu không có số nào thì in ra 0.

Ví dụ: nhập 20 thì in ra 2 3 5 7 11 13 17 19.

Kiểm tra: nhập 50.

Xem đáp số

2 3 5 7 11 13 17 19 23 29 31 37 41 43 47

Hướng dẫn giải chi tiết: liên hệ tác giả.

Nhập hai số nguyên a, b (1 ≤ a ≤ b ≤ 105). In ra số lượng số nguyên tố trong đoạn từ a đến b.

Ví dụ: nhập 1 20 thì in ra 8.

Kiểm tra: nhập 100 1000.

Xem đáp số

143

Hướng dẫn giải chi tiết: liên hệ tác giả.

Nhập số nguyên dương n (n ≤ 105). In ra tổng các số nguyên tố không vượt quá n.

Ví dụ: nhập 10 thì in ra 17.

Kiểm tra: nhập 1000.

Xem đáp số

76127

Hướng dẫn giải chi tiết: liên hệ tác giả.

Nhập số nguyên n (2 ≤ n ≤ 1012). In ra phân tích thừa số nguyên tố của n theo dạng: các thừa số tăng dần, nối bằng dấu *, thừa số có số mũ lớn hơn 1 viết p^k. Ví dụ 360 viết là 2^3*3^2*5.

Ví dụ: nhập 360 thì in ra 2^3*3^2*5.

Kiểm tra: nhập 1001000.

Xem đáp số

2^3*5^3*7*11*13

Hướng dẫn giải chi tiết: liên hệ tác giả.

Nhập số nguyên n (2 ≤ n ≤ 1012). In ra ước nguyên tố lớn nhất của n.

Ví dụ: nhập 360 thì in ra 5.

Kiểm tra: nhập 123456789.

Xem đáp số

3803

Hướng dẫn giải chi tiết: liên hệ tác giả.

Nhập số nguyên dương n (n ≤ 1012). In ra số lượng ước nguyên tố khác nhau của n.

Ví dụ: nhập 360 thì in ra 3.

Kiểm tra: nhập 1001000.

Xem đáp số

5

Hướng dẫn giải chi tiết: liên hệ tác giả.

Bài 10. Đếm ước bằng phân tích thừa số

Phần tiêu đề “Bài 10. Đếm ước bằng phân tích thừa số”

Nhập số nguyên dương n (n ≤ 1012). In ra số ước của n, dùng phân tích thừa số nguyên tố.

Ví dụ: nhập 360 thì in ra 24.

Kiểm tra: nhập 735134400.

Xem đáp số

1344

Hướng dẫn giải chi tiết: liên hệ tác giả.

Số nửa nguyên tố là số bằng tích của hai số nguyên tố (có thể bằng nhau), ví dụ 6 = 2 × 3, 9 = 3 × 3. Nhập số nguyên dương n (n ≤ 1012), in ra YES nếu n là số nửa nguyên tố, ngược lại in ra NO.

Ví dụ: nhập 91 thì in ra YES.

Kiểm tra: nhập 999962000357.

Xem đáp số

YES

Hướng dẫn giải chi tiết: liên hệ tác giả.

Nhập số nguyên dương n (n ≤ 1010). Đếm xem từ 1 đến n có bao nhiêu số có đúng ba ước.

Ví dụ: nhập 50 thì in ra 4.

Kiểm tra: nhập 100000000.

Xem đáp số

1229

Hướng dẫn giải chi tiết: liên hệ tác giả.

Hai số nguyên tố hơn kém nhau 2 đơn vị gọi là cặp số nguyên tố sinh đôi, ví dụ (3, 5), (11, 13). Nhập số nguyên dương n (n ≤ 105), đếm số cặp sinh đôi mà cả hai số đều không vượt quá n.

Ví dụ: nhập 20 thì in ra 4.

Kiểm tra: nhập 1000.

Xem đáp số

35

Hướng dẫn giải chi tiết: liên hệ tác giả.

Giả thuyết Goldbach nói rằng mọi số chẵn lớn hơn 2 đều viết được thành tổng hai số nguyên tố. Nhập số chẵn n (4 ≤ n ≤ 109), in ra hai số nguyên tố p ≤ q có p + q = n, với p nhỏ nhất có thể.

Ví dụ: nhập 28 thì in ra 5 23.

Kiểm tra: nhập 1000.

Xem đáp số

3 997

Hướng dẫn giải chi tiết: liên hệ tác giả.

Nhập số chẵn n (4 ≤ n ≤ 105). Đếm số cặp số nguyên tố (p, q) với p ≤ q và p + q = n.

Ví dụ: nhập 10 thì in ra 2.

Kiểm tra: nhập 100.

Xem đáp số

6

Hướng dẫn giải chi tiết: liên hệ tác giả.

Nhập số nguyên dương n (n ≤ 105). Đếm các số không vượt quá n vừa là số nguyên tố, vừa là số đối xứng (đọc xuôi ngược như nhau, ví dụ 131).

Ví dụ: nhập 100 thì in ra 5.

Kiểm tra: nhập 1000.

Xem đáp số

20

Hướng dẫn giải chi tiết: liên hệ tác giả.

Số siêu nguyên tố là số nguyên tố mà khi bỏ dần các chữ số bên phải, các số còn lại vẫn là số nguyên tố. Ví dụ 2333 là số siêu nguyên tố vì 2333, 233, 23, 2 đều là số nguyên tố. Nhập k (1 ≤ k ≤ 8), in ra số lượng số siêu nguyên tố có đúng k chữ số.

Ví dụ: nhập 2 thì in ra 9.

Kiểm tra: nhập 4.

Xem đáp số

16

Hướng dẫn giải chi tiết: liên hệ tác giả.

Nhập số nguyên dương k (k ≤ 104). In ra số nguyên tố thứ k (số nguyên tố thứ nhất là 2).

Ví dụ: nhập 5 thì in ra 11.

Kiểm tra: nhập 1000.

Xem đáp số

7919

Hướng dẫn giải chi tiết: liên hệ tác giả.

Nhập số nguyên dương n (3 ≤ n ≤ 105). Trong các cặp số nguyên tố liên tiếp p, q không vượt quá n, tìm cặp có hiệu q - p lớn nhất. In ra p và q; nếu có nhiều cặp thì in cặp có p nhỏ nhất.

Ví dụ: nhập 30 thì in ra 23 29.

Kiểm tra: nhập 1000.

Xem đáp số

887 907

Hướng dẫn giải chi tiết: liên hệ tác giả.

Nhập số nguyên dương n (n ≤ 1018). In ra số chữ số 0 tận cùng của n! = 1 × 2 × … × n.

Ví dụ: nhập 100 thì in ra 24.

Kiểm tra: nhập 1000.

Xem đáp số

249

Hướng dẫn giải chi tiết: liên hệ tác giả.

Nhập số nguyên dương n (n ≤ 1018) và số nguyên tố p (p ≤ 109). In ra số mũ lớn nhất k sao cho n! chia hết cho pk.

Ví dụ: nhập 10 2 thì in ra 8.

Kiểm tra: nhập 100 3.

Xem đáp số

48

Hướng dẫn giải chi tiết: liên hệ tác giả.