Tin học Tây Sơn


Join the forum, it's quick and easy

Tin học Tây Sơn
Tin học Tây Sơn
Bạn có muốn phản ứng với tin nhắn này? Vui lòng đăng ký diễn đàn trong một vài cú nhấp chuột hoặc đăng nhập để tiếp tục.

Sàng nguyên tố Eratosthenes

Go down

Sàng nguyên tố Eratosthenes Empty Sàng nguyên tố Eratosthenes

Bài gửi by Admin Sun Mar 12, 2023 7:00 am

Sàng Eratosthenes là một thuật giải toán cổ xưa để tìm các số nguyên tố nhỏ hơn 100. Thuật toán này do nhà toán học cổ Hy Lạp là Eratosthenes (Ơ-ra-tô-xten) “phát minh” ra.
Ban đầu, nhà toán học Eratosthenes sau khi tìm ra thuật toán, đã lấy lá cọ và ghi tất cả các số từ 2 cho đến 100. Ông đã chọc thủng các hợp số và giữ nguyên các số nguyên tố. Bảng số nguyên tố còn lại trông rất giống một cái sàng. Do đó, nó có tên là sàng Eratosthenes.
  • Hợp số là một số tự nhiên có thể biểu diễn thành tích của hai số tự nhiên khác nhỏ hơn nó


Giải thích:
Sàng nguyên tố Eratosthenes Thuat_Toan_Sang_Eratosthenes
Hình minh họa cho thấy thuật toán đơn giản để tìm số nguyên tố và các bội số. Các số tô màu giống nhau là cùng một họ, màu đậm hơn sẽ là số nguyên tố.
Để tìm các số nguyên tố nhỏ hơn hoặc bằng số tự nhiên N bằng sàng Eratosthenes, ta làm như sau:

  • Bước 1: Tạo 1 danh sách các số tự nhiên liên tiếp từ 2 đến n: (2, 3, 4,…, n).

  • Bước 2: Giả sử tất cả các số trong danh sách đều là số nguyên tố. Trong đó, p = 2 là số nguyên tố đầu tiên.

  • Bước 3: Tất cả các bội số của p: 2p, 3p, 4p,… sẽ bị đánh dấu vì không phải là số nguyên tố.

  • Bước 4: Tìm các số còn lại trong danh sách mà chưa bị đánh dấu và phải lớn hơn p. Nếu không còn số nào, dừng tìm kiếm. Ngược lại, gán cho p giá trị bằng số nguyên tố tiếp theo và quay lại bước 3.


Khi giải thuật kết thúc, tất các số chưa bị đánh dấu trong danh sách là các số nguyên tố cần tìm.
Cài đặt thuật toán:
const
Code:
conts nmax=1000;
var
        SNT:array[0..nmax+1] of boolean;
 
procedure sangnt;
var    i,j:longint;
begin
        fillchar(snt,sizeof(snt),true);
        snt[1]:=false;
        i:=2;
        while i<=trunc(sqrt(nmax)) do
                begin
                        while snt[i]=false do
                                inc(i);
                        for j:=2 to nmax div i do
                                snt[i*j]:=false;
                        inc(i);
                end;
 
        for i:=1 to nmax do
                if snt[i]=true then
                        write(i,' ');
end;
 
begin
        sangnt;
        readln;
end.


Admin
Admin
Admin
Admin

Posts : 1144
Points : -7561
Reputation : -10042
Join date : 16/11/2015
Age : 34

https://tinhocts.forumvi.com

Về Đầu Trang Go down

Về Đầu Trang

- Similar topics

 
Permissions in this forum:
Bạn không có quyền trả lời bài viết