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
반응형