어떤 숫자 n의 약수는 자기 자신의 절반 이하까지만 존재한다는 점을 기억하자. 즉 자기 자신을 제외한 약수는 항상 n/2 이하라는 의미이다. 예를 들어 숫자 16이 주어질 때
1 x 16
2 x 8 을 보면 1과 자기 자신을 제외하면 16의 약수는 2 x (16의 절반)이기 때문에
절반 이하까지만 존재한다.
다시 말해 어떤 수 n의 약수는 자기 자신을 제외하면 항상 n/2 이하이다.
def isPrime(x):
if x==1: # 1은 소수 아님
return False
for i in range(2, x//2+1): # x//2+1로 설정해야 x의 절반인 x/2이하까지 탐색
if x%i==0:
return False
else:
return True
x//2이 아닌 √x까지 검사하면 보다 빠르게 소수를 판별할 수 있다.
어떤 수 n이 소수가 아닌 합성수라면
n는 두 개의 자연수 a, b의 곱으로 표현할 수 있다.
여기서 만약 a, b 모두 √n보다 크다면, a, b의 곱은 n를 초과하게 된다.
즉 a x b = n를 만족하는 약수 쌍 중에서 적어도 하나는 반드시 √n이하이다. 예를 들어 36의 약수 쌍은
(1, 36) (2, 18) (3, 12) (4, 9) (6, 6) 으로 약수 쌍 중에서 하나는 반드시 √36=6이하이다. 따라서 6까지만 검사하면 36이 소수가 아님을 알 수 있다.
37을 예로 들면 √37=6.xxx로 2, 3, 4, 5, 6으로 나눠봐도 나누어떨어지지 않으므로 소수이다.
2부터 n//2까지 검사하면 시간 복잡도는 O(x)이고
2부터 √n까지 검사하면 시간 복잡도는 O(√x)로 줄어든다.
숫자 뒤집기
def reverse(x):
res=0
while(x>0):
t=x%10
res=res*10+t
x=x//10
return res
'알고리즘(파이썬)' 카테고리의 다른 글
자바와 다른 파이썬 (1) | 2025.02.11 |
---|---|
회문 문자열 (0) | 2025.02.11 |
소수 개수 구하기(에라토스테네스의 체) (0) | 2025.02.11 |
자릿수의 합 구하기 (0) | 2025.02.11 |
Python의 반올림 (0) | 2025.02.07 |