Trang 3 / 4 FirstFirst 1234 LastLast
Hiển thị kết quả từ 21 đến 30 / 39
  1. #21
    Tham gia
    22-10-2011
    Bài viết
    211
    Like
    2
    Thanked 30 Times in 19 Posts
    = Mình đang làm công tác bồi dưỡng HSG tin học trẻ không chuyên. Đây là năm đầu tiên làm việc này nên còn nhiều hạn chế. Hy vọng bạn có thể chia sẻ kinh nghiệm cho mình với! thankss
    +++++ MÌNH BẢO ĐẢM THUẬT TOÁN TRÊN LÀ DO MÌNH TỰ NGỘ RA ĐÓ, KHÔNG HỀ THAM KHẢO SÁCH NÀO CẢ.+++++++++[/QUOTE]

    Hi bạn!
    Thuật toán trên có thể nói là kinh điển, bởi vì nó sát với lý thuyết.
    Nhưng Học lập trình nói chung và Pascal nói riêng, thì thuật toán và tư duy mới là cái quan trọng.
    Theo ý tôi thì phân tích như sau (theo tôi nghĩ học sinh cấp II sẽ rất dễ hiểu)
    Thuật toán:
    Lần lượt xét:
    - X là 1,2,3,5,7,11 ==> là số NT
    Nếu không phải các số trên thì:
    - Chia số đó lần lượt cho 2,3,4..... số/2. Nếu gặp một số mà số đó chia hết thì dừng lại và kết luận nó không phải số nguyên tố, ngược lại nó là số nguyên tố.
    Sơ đồ thuật toán:

  2. #22
    Tham gia
    22-10-2011
    Bài viết
    211
    Like
    2
    Thanked 30 Times in 19 Posts
    Chương trình:

    Code:
    Program SoNguyenTo;
    Var
     x,n:Integer;
     SNT: Boolean;
    Begin
     SNT:=False; 
     x:=2;
     Write('Nhap So N:'); Readln(n)
      If (n=1) or (n=2) or (n=3) or (n=5) or (n=7) or (n=11) {*}
      Then SNT=True
      Else
       Repeat
        If (n mod x)>0 then SNT= False
        Else x:=x+1;
       Until (x<(N Div 2)) or (SNT=False);
      If SNT then Writeln(N, 'Là Số Nguyên Tố') 
      Else Writeln(N, ' Không Là Số Nguyên Tố');
     Readln;
    End.

    {*} Thực ra không cần đoạn này, nhưng để tính hiệu suất chương trình thì nên có.

  3. #23
    Tham gia
    12-11-2011
    Bài viết
    4
    Like
    0
    Thanked 0 Times in 0 Posts
    Nếu không sử dụng sqrt(n) thì hãy so sánh k*k với n. Mình không có Pascal nên code trực tiếp vào đây vậy. Chú ý rằng 1 không là số nguyên tố. Giải thuật là, kiểm tra từ k = 2 trở đi, nếu n không chia hết cho k thì tăng k lên 1, nhưng chỉ khi k*k < n, tức k < sqrt(n).
    Code:
    function IsPrime(n: word): boolean;
    var k: word;
    begin
    	if n <= 1 then IsPrime := False
    	else
    		begin
    			k := 2;
    			while (k*k < n) and (n mod k <> 0) do k := k + 1;
    			if k*k > n then IsPrime := True
    			else IsPrime := False
    		end
    end;

  4. #24
    Tham gia
    17-03-2010
    Bài viết
    11
    Like
    1
    Thanked 0 Times in 0 Posts
    Quote Được gửi bởi huan1802 View Post
    mình có một thuật toàn có thể nhanh hơn chút:

    function ktnguyento(x:longint):longint;
    var i:longint;
    begin
    i:=2;
    while (x mod i <>0) and (x>=2) then
    i:=i+1;
    if i=x then
    ktnguyento:=1;{nếu là số nguyên tố}
    else
    ktnguyento:=0;{nếu ko là số nguyên tố}
    end;

    procedure ketqua;
    var i:longint;
    begin
    write('Nhap so x: ');
    readln(x);
    if ktnguyento(x)=1 then
    writeln('So ',x,' là số nguyên tố')
    else
    writeln('So ',x,' ko la so nguyen to');
    end;

    bài này có thể tốn ít thời gian hơn
    thank anh nha đúng bài cần tìm

  5. #25
    Tham gia
    17-03-2010
    Bài viết
    11
    Like
    1
    Thanked 0 Times in 0 Posts
    Quote Được gửi bởi Em Chán Gà View Post
    Chương trình:
    {*} Thực ra không cần đoạn này, nhưng để tính hiệu suất chương trình thì nên có.
    hơ , cái này thuật toán bên dưới nó tự tính thêm vào cho dài hả anh

  6. #26
    Tham gia
    22-10-2011
    Bài viết
    211
    Like
    2
    Thanked 30 Times in 19 Posts
    Quote Được gửi bởi vanban1 View Post
    hơ , cái này thuật toán bên dưới nó tự tính thêm vào cho dài hả anh
    Dài là trong bài thì dài, nhưng khi chạy nếu nhập số nhỏ thì khỏi lặp vòng nào.

    Chú ý rằng 1 không là số nguyên tố.
    Chết cha, nhầm kiến thức rùi. Đúng 1 là số đặc biệt, không phải SNT, cũng không phải hợp số.

  7. #27
    Tham gia
    22-11-2011
    Bài viết
    11
    Like
    3
    Thanked 0 Times in 0 Posts
    tôi nghĩ là 'for i:=1 to so do' chứ(của bạn là for i:=1 to so div 2 do')
    Bởi vì như ban thì số 4 cũng là số nguyên tố. Vì d=2 và 3 không fai là sô nguyên tố vì d<>2(d=1).

  8. #28
    Tham gia
    22-10-2011
    Bài viết
    211
    Like
    2
    Thanked 30 Times in 19 Posts
    Quote Được gửi bởi Của tớ

    Write('Nhap So N:'); Readln(n) If (n=1) or (n=2) or (n=3) or (n=5) or (n=7) or (n=11) {*} Then SNT=True



    Nhờ khúc này nè bạn, chỉ chạy lặp khi lớn hơn 11. Còn tại sao lại chỉ tới Nó div 2 thì chắc ai cũng hiểu.

  9. #29
    Tham gia
    04-08-2011
    Bài viết
    90
    Like
    9
    Thanked 17 Times in 15 Posts
    Quote Được gửi bởi haplinhavxt View Post
    Vậy cho bạn số có 9999...7 (16 số 9) bạn định kiểm tra số này ntn?? (Kiểu dữ liệu chỉ là qword, real cũng được nhưng sài số thực làm gì cho mệt người =))))
    extended là kiểu số nguyên mà bạn.
    nếu cho 99999...7 thỳ xét nó có mod 6 =1 or 5 ko, nếu đc thỳ xét như
    bình thường

  10. #30
    Tham gia
    22-10-2010
    Bài viết
    7
    Like
    0
    Thanked 1 Time in 1 Post
    Quote Được gửi bởi ThangA3 View Post
    extended là kiểu số nguyên mà bạn.
    nếu cho 99999...7 thỳ xét nó có mod 6 =1 or 5 ko, nếu đc thỳ xét như
    bình thường
    extended là kiểu số thực màk =="

Trang 3 / 4 FirstFirst 1234 LastLast

Bookmarks

Quy định

  • Bạn không thể tạo chủ đề mới
  • Bạn không thể trả lời bài viết
  • Bạn không thể gửi file đính kèm
  • Bạn không thể sửa bài viết của mình
  •