-
05-13-2010, 04:39 AM #11
Silver member
- Ngày tham gia
- Oct 2015
- Bài viết
- 12
1000? Chắc chắn bài này giới hạn n sẽ không nhỏ hơn 10000 vì chạy với cách cổ nhất (cách của mình) thì với n=10000 chạy mất 1s. Có cải tiến phải giới hạn to nữa.
-
05-13-2010, 06:33 AM #12
Junior Member
- Ngày tham gia
- Aug 2015
- Bài viết
- 3
Bài hai mình nghĩ là bạn nên đưa ra giới hạn cho số N chứ. Để mọi người có thuật toán hoàn chỉnh [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG]
-
05-13-2010, 01:39 PM #13
Junior Member
- Ngày tham gia
- Nov 2015
- Bài viết
- 0
Gửi bởi trunga0
-
05-13-2010, 06:00 PM #14
Junior Member
- Ngày tham gia
- Aug 2015
- Bài viết
- 3
Nếu vậy thì mình nghĩ dùng sàng Eratosthene là đủ rồi. Đơn giản, dễ cài đặt. Sau đó thì for một vòng trong tập sô nguyên tố vừa sinh được để kiểm tra xem có bao nhiêu trường hợp thôi.
@TieuLong: Đoạn kiểm tra số nguyên tố của em không được gọn lắm, anh nghĩ là em nên sinh mảng số nguyên tố trước luôn rồi mới kiểm tra. Đoạn code khởi tạo các số nguyên tố từ 1 -> MaxN có thể viết như sau:
Mã:const maxN = 20004; var Prime : array [1..maxN] of longint; // lưu các số nguyên tố PrimeSqr : array [1..maxN] of longint; // lưu bình phương của các số nguyên tố. Count : longint; procedure InitPrime; var T, i, j, check : longint; begin Count := 2; check := 0; Prime[1] := 2; Prime[2] := 3; PrimeSqr[1] := 4; PrimeSqr[2] := 9; T := 3; while true do begin // Một số nguyên tố bất kì lớn hơn 3 chỉ có thể có dạng (6k+1) hoặc (6k+5) -> Có thể áp //dụng "bước nhảy 2" và "bước nhảy 4" trọng thuật toán sinh các số nguyên tố T := T + 2; If T > MaxN then exit; for i := 1 to Count do if (PrimeSqr[i] > T) then break else if (T mod Prime[i] = 0) then begin check := T; break; end; if (check <> T) then begin inc(Count); Prime[Count] := T; end; // T := T + 4; If T > MaxN then exit; {Đoạn này copy y nguyên đoạn ở trên, đoạn giữa hai dòng "T := T+2" và "T := T+4" xuống} end; end;
-
05-14-2010, 03:47 AM #15
Junior Member
- Ngày tham gia
- Aug 2015
- Bài viết
- 2
Em thấy cách của em tuy chưa gọn nhưng vẫn là nhanh hơn chứ. Trong khi anh sinh hết các số nguyên tố rồi mới tiến hành xử lí thì em kiểm tra các số i=1-> n/2 nếu số nào là nguyên tố thì tiếp kiểm tra số n-i là nguyên tố thì tăng đếm. Như thế được cái là không phải tạo mảng số nguyên tố, thời gian tạo mảng số nguyên tố cũng bằng thời gian em chạy xong test rồi.
Hang_vt: giới hạn 20000 [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG](!
-
05-14-2010, 05:06 AM #16
Junior Member
- Ngày tham gia
- Dec 2015
- Bài viết
- 0
@ Giang: Trên kia chỉ là đoạn code mẫu thôi, còn ứng dụng thì phải linh hoạt chứ [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG]
Thế để anh post thuật toán của anh lên nhá:
Đầu tiên là sinh các số nguyên tố từ 1->410 theo cách trên
Sau đó thì thực hiện các dòng lệnh:
Mã:function Check(T:longint):boolean; var i, j, k : longint; begin for i := 1 to maxN do if PrimeSqr[i] > T then exit(true) else if T mod Prime[i] = 0 then exit(false); end; Function Answer : longint; var dem,t,k : longint; begin dem := 0; t := 2; while (t <= N div 2) do begin if Check(t) and Check(N-t) then inc(dem); t := t+2; end; exit(dem); end;
-
05-15-2010, 04:27 AM #17
Junior Member
- Ngày tham gia
- Nov 2015
- Bài viết
- 3
Cách của anh áp dụng 2 định lí trong topic kiểm tra tính nguyên tố em đưa ra đúng không? Cách này ổn hơn cách cơ bản vì bước nhảy không còn là 1 mà là 2 4 2 4, khi kiểm tra cũng không từ 1->sqrt mà các snt trong 1->sqrt(N). Cách này ngon rồi, không biết có cách nào tốt hơn nữa không nhỉ?
-
05-15-2010, 06:00 AM #18
Administrator
- Ngày tham gia
- Feb 2014
- Bài viết
- 6
Cách tốt hơn nữa thì em dùng sàng, sàng Eratosthenes hay Atkin thì tuỳ em chọn. Thuật toán sàng có lẽ đủ nhanh cho em xử lí bài toán này. Em lên Wikipedia search là có thông tin về hai thuật toán này, nếu đọc được Wiki tiếng Anh thì càng tốt [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG]
-
07-10-2010, 11:17 PM #19
Silver member
- Ngày tham gia
- Jan 2016
- Bài viết
- 58
theo minh thi nen tao 1 tap hop de chua so nguyen to nho hon so n roi xet tong nhu ban da noi!!
-
07-24-2010, 04:59 PM #20
Silver member
- Ngày tham gia
- Oct 2015
- Bài viết
- 1
Nếu mệnh đề của Gôn-Bắc được chứng minh thì khỏe quá! Cứ output 2!
---------------------------------Bài viết đã được trộn ---------------------------------
Đây, mình xin cung cấp code sàng Eratosthenes
Procedure Eratosthenes(n: longint; var prime: array of boolean);
Var
i, j: longint;
Begin
Fillchar(prime, sizeof(prime), true);
prime[0]:=false; prime[1]:=false;
i:=2;
While (i*i<=n) do begin
if (prime) then begin
j:=i*i;
While (j<=n) do Begin
prime[j]:=false;
j:=j+i;
End;
End;
inc(i);
End;
End;
Xe nâng người Boom lift được Công Ty TNHH Trung thành phân phối chính hãng tại khu vực phía Bắc. Với chi phí đầu tư ban đầu thấp hơn rất nhiều so với các loại xe nâng dầu , xe nâng động cơ loại...
Xe nâng người được trung thành nhập khẩu giá tốt