[Python_Training] Sàng nguyên tố

Xem PDF



Tác giả:
Dạng bài
Ngôn ngữ cho phép
C#, C++, Clang, Clang++, Cobol, D, Groovy, Haskell, Java, JS, Kotlin, Lua, Node JS, ObjectiveC, OCaml, Output, Pascal, PHP, Prolog, Pypy, Pypy 3, Python, Ruby, Rust, Scala, Scratch, Swift
Điểm: 100 (p) Thời gian: 1.5s Bộ nhớ: 256M Input: bàn phím Output: màn hình

Bạn có một số nguyên dương \(N\). Nhiệm vụ của bạn là xuất ra tất cả các số nguyên tố từ \(1\) tới \(N\).

Input

  • Gồm một dòng duy nhất chứa số nguyên \(N\) (\(N \leq 10^6)\).

Output

  • Xuất ra tất cả các số nguyên tố từ \(1\) tới \(N\) trên cùng một dòng và cách nhau một dấu cách.

Example

Test 1

Input
10 
Output
2 3 5 7

Bình luận


  • 2
    thanphong    10:05 a.m. 22 Tháng 2, 2022 chỉnh sửa 10

    đây là ý tưởng của tôi tuy vẫn còn thiếu sót nhưng nó cũng khá ổn
    đầu tiên là tôi cho 1 hàm kiểm tra xem số đó có chia hết cho 2 3 5 7 hay không và đồng thời cũng kiểm tra xem số đó có phải là số chính phương hay không
    nếu có thì return 0
    ngược lại trả về 1
    đây là code kiểm tra của tôi

    -----------------------------------------------------------------------------

    **
    def nt1(a):

    k=1
    if a%2==0 or a%3==0 or a%5==0 or a%7==0 or ceil(sqrt(a))==sqrt(a):
        k=0
    if a in[2,3,5,7]:
        k=1
    return k
    

    **

    -----------------------------------------------------------------------------

    ở đây tôi không return k ngay sau khi kiểm tra xem nó có chia hết cho các số kia hay không vì vẫn còn 1 trường hợp là nó chính là các số bị chia dùng để kiểm tra nó :'))
    tiếp theo đó
    tôi lại xây dựng thêm 1 hàm kiểm tra số nguyên tố tiếp
    nhưng ở đây là các số lẻ
    hàm kiểm tra này có lẽ nhiều người cũng biết rồi nên tôi chỉ nói sơ qua thôi
    Tôi cho chạy từ 3 cho tới căn bậc 2 của n+1 rồi kiểm tra xem nếu có số nào chia hết cho nó thì return 0 ngay tại chỗ
    còn không thì return 1 khi hết vòng lặp
    ĐÂY LÀ CODE CỦA TÔI

    -----------------------------------------------------------------------------------------

    **
    def nt2(a):

    for i in range(3,ceil(sqrt(a))+1,2):
        if a%i==0:
            return 0
    return 1
    

    **

    cho những ai chưa biết thì hàm ceil ở đây là tìm 1 số nhỏ nhất không nhỏ hơn x
    mn có thể hiểu là nếu n là int thì ceil(n) vẫn sẽ bằng n
    nếu n là float và int(n)!=float(n) thì ceil(n)=int(n)+1
    ví dự như này nha

    1. n=10 thì ceil(n) vẫn bằng 10
    2. tuy nhiên nếu n=10.1 thì ceil(n) sẽ bằng 11
      NHƯ VẬY MN HIỂU RỒI CHỨ

    -----------------------------------------------------------------------------------------

    Ở đây tôi không cần kiểm tra nó có bé hơn 1 hay không vì điều này ở đây là vô nghĩa (đề bài yêu cầu xuất số nt từ 1 tới n và đồng nghĩa với việc không có số âm)
    sau đó
    tôi xuất 2 ra với tất cả n>=2
    theo đó
    tôi chỉ cần 1 vòng lặp chạy các phần tử lẻ từ 3 tới n+1 và chạy 2 đơn vị
    (tại sao ở đây tôi lại phải tăng n thêm 1 đơn vị???)
    mọi người chắc cũng biết vòng for trong python chỉ chạy tới n-1 nếu cho giới hạn là n
    tôi phải tăng thêm 1 đơn vị để tính luôn cả n vào trong vòng lặp (vì yêu cầu của đề là có tính luôn cả n)
    đây là CODE HOÀN CHỈNH CỦA TÔI

    ----------------------------------------------------------------------------------------------------------

    **
    from sys import stdin

    from math import ceil,sqrt
    n=int(stdin.readline())
    def nt1(a):
        k=1
        if a%2==0 or a%3==0 or a%5==0 or a%7==0 or ceil(sqrt(a))==sqrt(a):
            k=0
        if a in[2,3,5,7]:
            k=1
        return k
    def nt2(a):
        for i in range(3,ceil(sqrt(a))+1,2):
            if a%i==0:
                return 0
        return 1
    a=[]
    if n>=2:print(2,end=' ')
    for i in range(3,n+1,2):
        if nt1(i)==1:
            if nt2(i)==1:
                a+=[i]
                #print(i,end=' ')
    print(*a)
    

    **

    ------------------------------------------------------------------------------------------------------------

    có lẽ sẽ có 1 số người thắc mắc là tại sao tôi không xuất luôn ngay khi tìm thấy mà lại cho vào mảng rồi lại xuất cái mảng đó ra
    thực ra tôi đã so sánh về thời gian khi chạy của cả 2 cách trên
    nếu tôi thực hiện tìm được số nào thì xuất luôn ngay tại chỗ thì ưu điểm của nó là nó sẽ không tốn nhiều bộ nhớ như cách dùng mảng
    nhưng vấn đề là thời gian
    tuy dùng mảng sẽ tốn nhiều dữ liệu hơn nhưng ưu điểm của nó là nó sẽ có thời gian chạy nhanh hơn so với khi xuất ngay tại chỗ khi tìm được

    VỚI CÁCH LÀM NÀY CỦA TÔI THÌ NÓ CŨNG CHỈ ĂN ĐƯỢC 12/14 TEST THÔI
    MONG MỌI NGƯỜI HÃY GIÚP TÔI CÓ THÊM ĐƯỢC NHỮNG Ý KIẾN CHO ĐOẠN CODE NÀY ĐƯỢC HOÀN CHỈNH VÀO 1 NGÀY GẦN NHẤT
    TÔI XIN CẢM ƠN ヾ(•ω•`)o

    • 6 bình luận nữa