Python(백준)/약수,배수와 소수 2

[백준 파이썬 4948번]베르트랑 공준★에라토스테네스의 체★ver3.0★함수로 정의★list(filter(lambda x : list[x] == True , range(len(list)))==>리스트의 원하는 인덱스값 출력

goAhEAd_29 2023. 4. 12. 18:21
728x90
반응형

VERSION 3.0

import sys
import math

res = []
def is_prime(n):


    a = [True]*(2*n+1)
    a[0], a[1] = False , False
    for i in range(2,int(math.sqrt(2*n))+1):
        j=2
        if a[i]==True:
            while True:
                if i*j> len(a)-1:
                    break
                a[i*j]=False
                j+=1
    # idx = 0
    # cnt = 0
    # res2=[]
    sum = 0
    for i in range(n+1, len(a)):
        if a[i] == True:
            sum+=1 #sum에 소수인거만 더하기
    return sum
    #print(a[n+1:2*n+1].count(True))

while True:
    n = int(sys.stdin.readline())
    if n == 0:
        break
    print(is_prime(n))

VERSION 2.0

list(filter(lambda x : is_prime(m)[x] == True  , range(len(is_prime(m)))))

==>리스트의 원하는 인덱스값 출력 

import sys
import math
def is_prime(n , m): #n이하의 개수

    A = [True] * (m+1)

    A[0],A[1] = False , False

    for i in range(2,int(math.sqrt(m)) +1):
        if A[i] == True:
            p=2
            while i*p <= m:

                A[i*p]= False
                p+=1
    # print(A)
    A[n] = False
    sum = 0
    t = 0
    for k in range(n ,len(A)):
        if A[k] == True:
            sum+=1
    # print(len(A[n:m]))
    # print(t)
    return sum
res= []
while True:
    n = int(sys.stdin.readline())
    if n==0:
        break
    else:
        # print(f'cal(2*n) : {cal(2*n) }')
        # print(f'cal(n) : {cal(n)}')
        res.append(is_prime(n , 2*n))
for k in res:
    print(k)



#%%

 

VERSION 1.0

import math
import sys
# 소수 판별 함수(에라토스테네스의 체)
def is_prime_number(m, n):
    # 2부터 n까지의 모든 수에 대하여 소수 판별
    array=[]
    for i in range(n+1):
        array.append(True)
    array[1] , array[0] = False ,False
    # 처음엔 모든 수가 소수(True)인 것으로 초기화(0과 1은 제외)
    # 에라토스테네스의 체
    for i in range(2, int(math.sqrt(n)) + 1): #2부터 n의 제곱근까지의 모든 수를 확인하며 ==> 루트 26 ==> 5.xxx ==int(5.xxxx) ==> 5 +1 = 6
        if array[i] == True: # i가 소수인 경우(남은 수인 경우)
            # i를 제외한 i의 모든 배수를 지우기
            j = 2
            while i * j <= n:

                array[i * j] = False
                j += 1
                #2*2 < 13:                2*2<5
                #array[4] = False         array[4] =False
                #j+=1 ==> j=3             j=3
                #2*3 < 13:
                #array[6] =False
                #j+=1 ==> j=4
                #2*4 < 13:
                #array[8] = False
                #2*5 < 10:
                #array[10] = False
                #j+=1 ==> j=5
                #2*6 < 12:
                #array[12] = False
                #j+=1 ==> j=6
                #2*7 < 14:
                #array[14] = False
                #j+=1 ==> j=7
                #array
    array[m] = False #m보다 큰거여서 FALSE 처리
    array2=[]
    sum = 0
    for i in range(m, len(array)):

        if array[i] == True:
            sum+=1 #sum에 소수인거만 더하기
    return sum

res=[]
while True:
    A = int(sys.stdin.readline())
    if A != 0: #A가 0이면 종료한다.
        res.append(is_prime_number(A, 2*A))
        #A부터 2A까지의 범위에서의 소수갯수 구하기
    else:
        break
for i in res:
    print(i)

 

728x90
반응형