파이썬 소수 나열하기
2022. 2. 7. 19:30ㆍ컴퓨터 사이언스/Algorithm
반응형
파이썬 소수 나열하기
소수란 1과 자기 자신 이외의 정수로 나누어 떨어지지 않는 수를 의미합니다.
즉 1과 자기 자신 이외의 정수로 나누어 떨어진다면 소수가 아님을 알 수 있습니다.
이를 통해 작성한 코드는 아래와 같습니다.
cnt = 0 # 곱셈과 나눗셈을 합한 횟수
ptr = 0 # 이미 찾은 소수의 갯수
prime = [None] * 500 # 소수를 저장할 배열
prime[ptr] = 2 # 2는 소수이기에 미리 지정한다.
ptr += 1
for n in range(3, 1001, 2): # 짝수는 확실한 합성수이므로, 5부터 1000까지 홀수만 대상으로 반복
for i in range(1, ptr):
cnt += 1
if n % ptr[i] == 0: # n이 소수로 나누어지면, 합성수이므로 break 문을 통해 빠져나간다.
break
else: # n이 소수로 나누어지지 않는다면 소수 배열에 추가해준다.
prime[ptr] = n
ptr += 1
for i in range(ptr):
print(ptr[i])
약수를 구할 때
만약 100의 약수를 구한다고 치면
2 * 50
4 * 25
5 * 20
20 * 5
25 * 4
50 * 2
이러한 약수들이 나올 것입니다
여러분은 위 약수들의 특징에 대해 눈치 채셨나요???
특징은 바로 "대칭성" 입니다!
2 * 50
4 * 25
5 * 20
와
20 * 5
25 * 4
50 * 2
이 서로 대칭을 이룬다는 것인데요.
즉 계산을 할 때 절반만 계산을 해도 같은 의미라는 뜻입니다!
2 * 50
4 * 25
5 * 20
20 * 5
25 * 4
50 * 2
이를 통해 소수를 구할 때 숫자가 본인의 제곱근 이하의 어떤 소수로도 나누어 떨어지지 않으면 소수임을 구하는 알고리즘을
만들어 위 코드의 연산 횟수를 더 줄일 수 있습니다!
cnt = 0 # 곱셈과 나눗셈을 합한 연산 횟수
ptr = 0 # 이미 찾은 소수의 갯수
prime = [None] * 500 # 소수를 저장할 배열
prime[ptr] = 2 # 2는 소수이기에 미리 지정한다.
ptr += 1
prime[ptr] = 3 # 3은 소수이기에 미리 지정한다.
ptr += 1
for n in range(5, 1001, 2): # 짝수는 확실한 합성수이므로, 5부터 1000까지 홀수만 대상으로 반복
i = 1
while prime[i] * prime[i] <= n: # prime[i]가 n의 제곱근보다 작으면 종료
cnt += 2
if n % prime[i] == 0: # n이 소수로 나누어지면 합성수이므로 break
break
i += 1
else: # 나누어 떨어지지않는다면 소수이므로 배열에 추가해준다.
prime[ptr] = n
ptr += 1
cnt += 1 # 연산 횟수 1을 더해준다.
Devide & Conquer
while prime[i] * prime[i] <= n: # prime[i]가 n의 제곱근보다 작으면 종료
cnt += 2
- n의 제곱근을 구하는 것보다 prime[i]를 제곱으로 만드는게 더 쉽기에 위와 같이 하였습니다
- cnt는 곱셈과 나눗셈을 합한 횟수를 의미하기에 곱셈이나 나눗셈시 2를 더해줍니다.
반응형
'컴퓨터 사이언스 > Algorithm' 카테고리의 다른 글
파이썬 배열 이진 검색 (0) | 2022.02.09 |
---|---|
파이썬 배열 선형 검색 (0) | 2022.02.08 |
파이썬 배열 역순 정렬, 기수 변환하기 (0) | 2022.02.05 |
파이썬 배열 원소의 최댓값 구하기 (0) | 2022.02.04 |
동백 // 백준 파이썬 2750번: 수 정렬하기 (0) | 2022.01.10 |