[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


  • 0
    douzxje    12:00 p.m. 2 Tháng 12, 2023

    sàng atkin ac ae ơi :)))


    • 0
      thanphong    11:34 p.m. 10 Tháng 3, 2022

      tại sao tôi vẫn k acp được :'))

      tôi đã dùng đến tận miller rồi cơ mak :'))

      ai cho tôi cách nào có thể chạy được đi :'))

      1 phản hồi

      • 0
        thanphong    10:10 a.m. 22 Tháng 2, 2022

        Ơ KÌA AD
        SAO NÓ KHÔNG XUỐNG DÒNG VẬY

        1 phản hồi

        • 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


          • -1
            thanphong    9:36 a.m. 22 Tháng 2, 2022

            ai chỉ tôi các acp test cuối đi


            • -1
              thanphong    9:17 a.m. 22 Tháng 2, 2022

              k ac đc 2 test cuối là sao nhờ :'))


              • 0
                khoa2008    3:29 p.m. 18 Tháng 2, 2022

                TLE nguyên bài =)))))