Viết chương trình để in ra màn hình các số nguyên tố từ 1 đến N, với N là số ngu…
P/s: nhập trên phần mềm python, viết lý thuyết + thực hành trên python và chụp màn hình kết quả)
Trước hết, chúng ta cùng ôn lại một chút lý thuyết nhé.
Lý thuyết: Số nguyên tố là gì?
Một số nguyên dương được gọi là số nguyên tố nếu nó chỉ có hai ước số dương phân biệt là 1 và chính nó.
Ví dụ:
– Số 2 là số nguyên tố vì nó chỉ chia hết cho 1 và 2.
– Số 3 là số nguyên tố vì nó chỉ chia hết cho 1 và 3.
– Số 4 không phải là số nguyên tố vì nó chia hết cho 1, 2 và 4.
– Số 1 không được coi là số nguyên tố vì nó chỉ có một ước duy nhất là chính nó.
Thuật toán để kiểm tra một số có phải là số nguyên tố hay không:
Để kiểm tra xem một số nguyên dương \(n\) có phải là số nguyên tố hay không, chúng ta có thể làm như sau:
1. Nếu \(n\) nhỏ hơn 2, thì \(n\) không phải là số nguyên tố.
2. Duyệt qua tất cả các số nguyên \(i\) từ 2 đến căn bậc hai của \(n\) (tức là \(i \le \sqrt{n}\)).
3. Nếu \(n\) chia hết cho bất kỳ số \(i\) nào trong khoảng này (tức là \(n % i == 0\)), thì \(n\) không phải là số nguyên tố.
4. Nếu vòng lặp kết thúc mà không tìm thấy số \(i\) nào mà \(n\) chia hết, thì \(n\) là số nguyên tố.
Lưu ý: Chúng ta chỉ cần kiểm tra đến căn bậc hai của \(n\) vì nếu \(n\) có một ước số \(d\) lớn hơn \(\sqrt{n}\), thì nó cũng phải có một ước số \(n/d\) nhỏ hơn \(\sqrt{n}\).
Ý tưởng bài toán:
Để in ra các số nguyên tố từ 1 đến N, chúng ta sẽ thực hiện các bước sau:
1. Nhập vào một số nguyên dương N từ bàn phím.
2. Duyệt qua từng số nguyên \(num\) từ 2 đến N. (Chúng ta bắt đầu từ 2 vì 1 không phải là số nguyên tố).
3. Với mỗi số \(num\), chúng ta sẽ sử dụng một hàm hoặc một đoạn mã để kiểm tra xem \(num\) có phải là số nguyên tố hay không, dựa trên thuật toán đã nêu ở trên.
4. Nếu \(num\) là số nguyên tố, chúng ta sẽ in nó ra màn hình.
Bây giờ, chúng ta sẽ đi vào phần thực hành trên Python.
Thực hành trên Python:
Bước 1: Viết hàm kiểm tra số nguyên tố.
Chúng ta sẽ tạo một hàm có tên là \(is_prime(n)\) để kiểm tra xem một số \(n\) có phải là số nguyên tố hay không.
python
import math
def is_prime(n):
# Số nhỏ hơn 2 không phải là số nguyên tố
if n < 2:
return False
# Duyệt từ 2 đến căn bậc hai của n
# Sử dụng math.isqrt(n) để lấy phần nguyên của căn bậc hai, hiệu quả hơn
for i in range(2, math.isqrt(n) + 1):
# Nếu n chia hết cho i, thì n không phải là số nguyên tố
if n % i == 0:
return False
# Nếu vòng lặp kết thúc mà không tìm thấy ước số nào khác 1 và chính nó, thì n là số nguyên tố
return True
Giải thích hàm \(is_prime(n)\):
– \(import math\): Dòng này cho phép chúng ta sử dụng các hàm toán học, cụ thể là \(math.isqrt()\) để tính căn bậc hai.
– \(def is_prime(n):\): Khai báo một hàm tên là \(is_prime\) nhận vào một tham số là \(n\).
– \(if n < 2:\): Kiểm tra điều kiện cơ bản. Nếu \(n\) nhỏ hơn 2, nó không thể là số nguyên tố, nên trả về \(False\).
– \(for i in range(2, math.isqrt(n) + 1):\): Đây là vòng lặp chính. Nó sẽ lặp qua các số nguyên \(i\) bắt đầu từ 2 cho đến giá trị nguyên lớn nhất không vượt quá căn bậc hai của \(n\). \(math.isqrt(n)\) trả về phần nguyên của căn bậc hai của \(n\). Chúng ta cộng thêm 1 để đảm bảo bao gồm cả giá trị căn bậc hai nếu nó là số nguyên.
– \(if n % i == 0:\): Kiểm tra xem \(n\) có chia hết cho \(i\) hay không. Nếu có, nghĩa là \(n\) có một ước số khác 1 và chính nó, nên nó không phải là số nguyên tố. Hàm trả về \(False\).
– \(return True\): Nếu vòng lặp kết thúc mà không tìm thấy bất kỳ ước số nào khác, có nghĩa là \(n\) chỉ chia hết cho 1 và chính nó, do đó nó là số nguyên tố. Hàm trả về \(True\).
Bước 2: Viết chương trình chính để nhập N và in các số nguyên tố.
python
# Nhập giá trị N từ bàn phím
try:
N = int(input(“Nhập vào một số nguyên dương N: “))
if N <= 0:
print("Vui lòng nhập một số nguyên dương.")
else:
print(f"Các số nguyên tố từ 1 đến {N} là:")
# Duyệt qua các số từ 2 đến N
for num in range(2, N + 1):
# Sử dụng hàm is_prime để kiểm tra
if is_prime(num):
print(num, end=" ") # In số nguyên tố và thêm khoảng trắng thay vì xuống dòng
print() # Xuống dòng sau khi in xong danh sách
except ValueError:
print("Đầu vào không hợp lệ. Vui lòng nhập một số nguyên.")
Giải thích chương trình chính:
– \(try…except ValueError:\): Đây là khối xử lý ngoại lệ. Nó giúp chương trình không bị dừng đột ngột nếu người dùng nhập vào một ký tự không phải là số.
– \(N = int(input(“Nhập vào một số nguyên dương N: “))\): Dòng này yêu cầu người dùng nhập vào một giá trị và chuyển nó thành kiểu số nguyên.
– \(if N <= 0:\): Kiểm tra xem N có phải là số nguyên dương hay không.
– \(print(f”Các số nguyên tố từ 1 đến {N} là:”)\): Thông báo cho người dùng biết kết quả sắp hiển thị.
– \(for num in range(2, N + 1):\): Vòng lặp này sẽ duyệt qua từng số \(num\) từ 2 đến \(N\) (bao gồm cả \(N\)).
– \(if is_prime(num):\): Gọi hàm \(is_prime\) để kiểm tra xem \(num\) có phải là số nguyên tố hay không.
– \(print(num, end=” “)\): Nếu \(is_prime(num)\) trả về \(True\), số \(num\) sẽ được in ra màn hình. Tham số \(end=” “\) đảm bảo rằng các số được in ra trên cùng một dòng, cách nhau bởi dấu cách, thay vì mỗi số một dòng.
– \(print()\): Sau khi vòng lặp kết thúc, dòng này sẽ in ra một ký tự xuống dòng để làm cho kết quả hiển thị gọn gàng hơn.
Toàn bộ chương trình:
Kết hợp cả hai phần trên, chúng ta có chương trình hoàn chỉnh:
python
import math
def is_prime(n):
if n < 2:
return False
for i in range(2, math.isqrt(n) + 1):
if n % i == 0:
return False
return True
try:
N = int(input("Nhập vào một số nguyên dương N: "))
if N <= 0:
print("Vui lòng nhập một số nguyên dương.")
else:
print(f"Các số nguyên tố từ 1 đến {N} là:")
for num in range(2, N + 1):
if is_prime(num):
print(num, end=" ")
print()
except ValueError:
print("Đầu vào không hợp lệ. Vui lòng nhập một số nguyên.")
Bây giờ, chúng ta sẽ xem kết quả khi chạy chương trình này.
Chụp màn hình kết quả thực hành trên Python:
Giả sử chúng ta nhập vào N = 30.
[Ở đây, thầy sẽ mô phỏng việc chụp màn hình. Các em tự thực hành và chụp màn hình của mình nhé.]
Ví dụ 1:
Nhập N = 30
Chương trình sẽ chạy và in ra:
Nhập vào một số nguyên dương N: 30
Các số nguyên tố từ 1 đến 30 là:
2 3 5 7 11 13 17 19 23 29
Ví dụ 2:
Nhập N = 10
Chương trình sẽ chạy và in ra:
Nhập vào một số nguyên dương N: 10
Các số nguyên tố từ 1 đến 10 là:
2 3 5 7
Ví dụ 3:
Nhập N = 1
Chương trình sẽ chạy và in ra:
Nhập vào một số nguyên dương N: 1
Các số nguyên tố từ 1 đến 1 là:
(Trong trường hợp này, không có số nguyên tố nào từ 1 đến 1, nên không có gì được in ra sau câu thông báo.)
Ví dụ 4:
Nhập giá trị không hợp lệ (ví dụ: “abc”)
Chương trình sẽ chạy và in ra:
Nhập vào một số nguyên dương N: abc
Đầu vào không hợp lệ. Vui lòng nhập một số nguyên.
Ví dụ 5:
Nhập giá trị âm (ví dụ: -5)
Chương trình sẽ chạy và in ra:
Nhập vào một số nguyên dương N: -5
Vui lòng nhập một số nguyên dương.
Như vậy là chúng ta đã hoàn thành bài tập viết chương trình tìm các số nguyên tố từ 1 đến N. Các em về nhà luyện tập thêm với các giá trị N khác nhau để hiểu rõ hơn bài toán nhé. Nếu có bất kỳ thắc mắc nào, đừng ngần ngại hỏi thầy!
n = int(input())
primes = [True]*(n + 1)
p = 2
while p*p <= n:
if primes[p]:
for q in range(p*p, n + 1, p):
primes[q] = False
p += 1
primes[0] = False
primes[1] = False
for i in range(n + 1):
if primes[i]:
print(i)
# Hoidap247
# hoanganhnguyen09302
Thuật toán Eratosthenes:
Theo thuật toán eratosthenes, ta sẽ chọn lần lượt các số nguyên tố (giả sử ban đầu, tất cả số đều là số nguyên tố) và loại bỏ bội của chúng (khi \(m\) là bội của \(n\) thì \(m\vdotsn\)). Sau khi kết thúc quá trình, các số còn lại là số nguyên tố.
Vì khi chọn một số \(i\), ta sẽ loại từ \(i^2\) (do các bội trước đó của \(i\) đã bị các số nguyên tố trước nó loại) nên chỉ cần loại từ \(2\) đến \(\sqrt{n}\) là được.
Ví dụ: Ban đầu có \(20\) số, ta sẽ loại bỏ như sau: Bắt đầu từ \(2\) đến \(4\) (\(\sqrt{n} ~~ 4.47\))
Chọn \(2\): Loại \(4\), \(6\), \(8\), \(10\), \(12\), \(14\), \(16\), \(18\), \(20\).
Chọn \(3\): Loại \(9\), \(12\), \(15\), \(18\).
\(4\) Đã bị loại.
Kết thúc quá trình, các số còn lại là: \(2\), \(3\), \(5\), \(7\), \(11\), \(13\), \(17\), \(19\).
\(\\\)
Code tham khảo:
from math import sqrt
n = int(input(‘n = ‘))
a = [True] * (n+1)
a[0] = a[1] = False #0 và 1 không phải số nguyên tố
for i in range(2, int(sqrt(n))+1):
if a[i]:
for j in range(i**2, n+1, i):
a[j] = False #Loại bỏ các bội của i
for i in range(n+1):
if (a[i]):
print(i, end=’ ‘) #Xuất các số nguyên tố
\(\\\)
\(\bb\color{green}{\text{@Daoanhviet96}}\)