기초 수학
[기초수학] 약수와 소수
scone
2022. 4. 26. 00:27
[개념]
- 어떤 수를 나누어 떨어지게 하는 수를 약수라고 하고
- 1과 자신만을 약수로 가지는 수를 소수라고 합니다. (단, 1은 소수가 아니다.)
[ 실습 1 ] 소수 찾기
def is_decimal(num):
if num <= 1: # 0,1 관련 예외 처리
return False
for i in range(2,int(num**(1/2)+1)):
if num%i==0:
return False
return True
for i in range(31):
if is_decimal(i):
print(i, end=' ')
# 2 3 4 5 6 7 8 9 11 13 15 17 19 23 25 29
코드 해석
num이 주어졌을 때,
num이 0 또는 1 또는 2 일 때 예외 처리하였습니다. ( 0, 1은 소수가 아니고, 2는 소수 )
2를 예외처리한건 num이 2일 때, 바로 밑에 for문에서 num이 2로 나누어지기 때문에 약수 처리되기 때문입니다.
( 첨엔 이 부분을 생각하지 못했고, 디버깅 하다 발견하였습니다. )
2일때는 예외처리 할 필요가 없었다.
범위를 range( 2, int(num**(1/2))+1 ) 로 하면
num 이 2일 때, range(2,2)로 아무것도 iterate하지 않기 때문에 굳이 예외처리 할 필요가 없었다.
그 후 2부터 차례대로 num을 나눠보고, 만약 추가적인 약수를 발견할 경우
이는 소수가 아님을 알 수 있고
num의 sqrt 값 까지 (소수 첫째 자리에서 내림함) 나눠봤음에도 불구하고 약수를 발견하지 못할 경우
소수 임을 알 수 있습니다.
[실습 2] 1부터 30까지 숫자 중 5로 나눈 몫과 나머지가 모두 소수인 숫자들
# 1부터 30까지 숫자 중 5로 나눈 몫과 나머지가 모두 소수인 숫자들
def is_decimal(num):
if num <= 1:
return False
for i in range(2,int(num**(1/2))+1):
if num%i==0:
return False
return True
for num in range(1,31):
if is_decimal(num%5) and is_decimal(num//5):
print(num, end = ' ')
# 12 13 14 17 18 19 22 23 24 27 28 29
위에서 만든 소수 찾기 함수를 응용하여 문제를 해결하였습니다.
실습 3. 소수와 합성수 찾기
numbers = int(input())
for number in range(2,numbers+1):
flag=True
for i in range(2,int((number)**(1/2)+1)):
if number % i == 0:
flag = False
break
if flag :
print('{}는 소수'.format(number))
else :
print('{}는 \t\t 합성수'.format(number))
'''
30
2는 소수
3는 소수
4는 합성수
5는 소수
6는 합성수
7는 소수
8는 합성수
9는 합성수
10는 합성수
11는 소수
12는 합성수
13는 소수
14는 합성수
15는 합성수
16는 합성수
17는 소수
18는 합성수
19는 소수
20는 합성수
21는 합성수
22는 합성수
23는 소수
24는 합성수
25는 합성수
26는 합성수
27는 합성수
28는 합성수
29는 소수
30는 합성수
'''
코드 설명
앞전에 했던 소수찾기와 마찬가지로
자기 자신과 1을 제외한, number보다 작은 수 중에서 나눠지는 수가 있으면 합성수
나눠지는 수가 없으면 소수로 분류했습니다.