
어떤 수를 나누어 떨어지게 하는 수
e.g. 2의 약수 : 1,2 / 8의 약수 : 1,2,4,8
N의 약수는
N이하로 나눴을 때 나머지가 0(나누어 떨어지는)인 그 수가 N의 약수이다.
e.g. 8의 약수 구하기
8 % 1 == 0
8 % 2 == 0
8 % 3 != 0
8 % 4 == 0
8 % 5 != 0
8 % 6 != 0
8 % 7 != 0
8 % 8 == 0
즉, 8의 약수 1,2,4,8
python으로 활용해보면,
#파이썬을 이용해서 사용자가 입력한 숫자의 약수를 출력해보자
input_num = int(input('0보다 큰 정수 입력 : '))
list = []
for i in range(1,input_num+1) :
if input_num % i == 0 : #나누어 떨어지면 약수
list.append(i)
print(f'{input_num}의 약수 : {list}')
1과 자기 자신만을 약수로 가지는 수 (1제외)
e.g. 2,3,5,7,9,11,13,17,19,23 ...
소수는 자기자신보다 작은 수 들로 나눴을 때
나머지가 0이 되지않는(나누어 떨어지는 수가 없는) 수가 소수이다.
단, 1제외
e.g.
2는 자기보다 작은수가 1밖에 없으므로 소수
3은
3 % 2 != 0
이므로 소수
4는
4 % 2 == 0
4 % 3 != 0
이므로 소수가 아니다.
python으로 활용해보면,
input_num = int(input('0보다 큰 정수 입력 : '))
#파이썬을 이용해서 사용자가 입력한 숫자가 소수인지 판별하자
for i in range(2,input_num) :
flag = True
if input_num % i == 0:
flag = False
break
if flag == True :
print(f'{input_num}은 소수')
else :
print(f'{input_num}은 합성수')
#파이썬을 이용해서 사용자가 입력한 숫자까지의 소수를 출력해보자
list = []
for i in range(2,input_num+1) :
for n in range(2,i) :
flag = True
if i % n == 0 :
flag = False
break
if flag == True :
list.append(i)
print(f'{input_num}까지의 소수 : {list}')
#난수의 약수, 소인수를 구하라
import random
num = random.randint(100,1000)
print(f'난수는 {num}')
a = []
b = []
for i in range (1,num+1) :
#약수
if num % i == 0 :
a.append(i)
#소수
flag = True
for r in range (2,i) :
if i % r == 0 :
flag = False
break
if (flag) :
b.append(i)
print(f'{num}의 약수 : {a}')
print(f'{num}까지의 소수 : {b}')
#소인수
n = 2
c = []
num2 = num
while n <= num :
if num % n == 0:
c.append(n)
num /= n
else :
n += 1
print(f'{num2}의 소인수 : {c}')
인수(약수)중에서 소수인 수
e.g.
12의 약수 : 1,2,3,4,6,12
12의 약수에서 소수 : 2,3
12의 소인수 : 2,3
input_num = int(input('0보다 큰 정수 입력 : '))
list = []
for i in range(2,input_num +1) :
if input_num % i == 0 : #input_num의 약수 = i
flag = True
for r in range (2,i) : #i가 소수인지 판별
if i % r == 0 :
flag = False
break
if flag == True :
list.append(i)
print(f'{input_num}의 소인수 : {list}')
e.g.
20 : 2*10
10 : 5*2
20 : 2*2*5 = 2^2*5
소인수 분해는 우선 대상 수를 2로 나눠보고
1. 2로 나눠질 경우 해당 몫을 다시 2로 나누기
2. 2로 나눠지지 않을 경우 3,4,5..로 몫을 나눠보기
input_num = int(input('0보다 큰 정수 입력 : '))
list_soinsu = []
temp_num = input_num
n = 2
while n <= temp_num :
if temp_num % n == 0 :
list_soinsu.append(n)
temp_num /= n
else :
n += 1
print(f'{input_num}의 소인수분해 : {list_soinsu}')
소인수 분해를 통해 약수를 알 수 있다.

# 사용자 입력수에 x를 곱해 y의 제곱이 된다고 할 때, x에 해당하는 가장 작은 정수
num = int(input('0보다 큰 정수 입력 : '))
list = []
temp = num
n = 2
while n <= temp :
if temp % n == 0 :
if n not in list :
list.append(n)
else :
list.remove(n)
temp /= n
else :
n += 1
result = 1
for i in list :
result *= i
print(f'{num}가 y의 제곱이 되는 가장 작은 정수 : {result}')
#난수를 소인수분해하고 각각의 소인수의 대한 지수를 출력하자
import random
rnum = random.randint(100,1000)
print(f'난수 : {rnum}')
#소인수 구하기
soinsu = []
n = 2
while n <= rnum :
if rnum % n == 0 :
print(f'소인수 : {n}')
soinsu.append(n)
rnum /= n
else :
n += 1
print(f'soinsu : {soinsu}')
tempnum = 0
for s in soinsu :
if tempnum != s :
print(f'{s}의 개수 : {soinsu.count(s)}')
tempnum = s
공약수 : 공통된 약수
최대공약수 : 공통된 약수 중 가장 큰 수
공약수 -> 최대공약수 : 공약수 중 가장 큰것
최대공약수 -> 공약수 : 최대공약수의 약수
e.g.
36의 약수 : 1,2,3,4,6,9,12,18,36
60의 약수 : 1,2,3,4,5,6,10,12,15,20,30,60
36과 60의 공약수 : 1,2,3,4,6,12
36과 60의 최대공약수 : 12
소인수분해 후 공통 지수를 곱한다.
e.g.
36의 소인수분해 : 2*2*3*3
60의 소인수분해 : 2*2*3*5
최대공약수 : 2*2*3 = 12
#두개의 수를 입력하면 공약수와 최대공약수를 출력하는 코드를 작성
# -> 두 수의 공통 약수중 가장 큰 수
num1 = int(input('1보다 큰 정수 입력 : '))
num2 = int(input('1보다 큰 정수 입력 : '))
list = []
for i in range(1,min(num1,num2)+1) : #약수는 본인자신보다 클 수 없고 공통약수를 구하므로 작은수까지 for문
if num1 % i == 0 and num2 % i == 0 : #공통약수
list.append(i)
print(f'{num1}, {num2}의 공약수 : {list}')
print(f'{num1}, {num2}의 최대공약수 : {max(list)}')
#우유와 빵을 남김없이 동일하게 나눠줬을 때,
#학생 한명이 갖게되는 우유와 빵의 개수
bread = 112
milk = 80
n = []
for i in range (1,milk+1) :
if bread % i == 0 and milk % i == 0 :
n.append(i)
bread /= max(n)
milk /= max(n)
print(f'학생 한명이 받게되는 빵 : {int(bread)} , 우유 {int(milk)}')
x,y 의 최대공약수는 y와 r(x % y)의 최대공약수와 같다.
num1 = int(input('1보다 큰 정수 입력 : '))
num2 = int(input('1보다 큰 정수 입력 : '))
temp1 = num1
temp2 = num2
while temp2 > 0 :
temp = temp2 #임의로 담아두고
temp2 = temp1 % temp2 #r값을 temp2에 담아준다
temp1 = temp #temp1 = temp2
print(f'{num1},{num2}의 최대공약수는 {temp1}이다.') #temp1 = temp2
#2개의 난수의 공약수와 최대공약수를 구하고 서로소라면 서로소를 표기하자
import random
rnum1 = random.randint(1,100)
rnum2 = random.randint(1,100)
for i in range (1,min(rnum1,rnum2)+1):
if rnum1 % i == 0 and rnum2 % i == 0:
print(f'{rnum1}와 {rnum2}의 공약수 : {i}')
max_num = i
print(f'{rnum1}와 {rnum2}의 최대공약수 : {max_num}')
if max_num == 1 :
print(f'{rnum1}와 {rnum2}는 서로소이다.')
공배수 : 공통된 배수
최소공배수 : 공통된 배수 중 가장 작은 수
공통인 소인수의 거듭제곱에서 지수가 크고 공통이 아닌 수를 모두 곱한다.
10의 소인수분해 : 2*5
25의 소인수분해 : 5*5
공통이 아닌수 : 2
지수가 큰것 : 5^2
최소공배수 : 2*5^2 = 50
n1과 n2의 최소공배수 : n1 * n2 / 최대공약수
#두개의 수를 입력하면 최소공배수를 출력하는 코드를 작성하자
# -> 두개의 수 곱하기한 값에 최대공약수 나누기
n1 = int(input('1보다 큰 정수 입력 : '))
n2 = int(input('1보다 큰 정수 입력 : '))
list = []
for i in range(1,min(n1,n2)+1) :
if n1 % i == 0 and n2 % i == 0 :
list.append(i)
max = max(list)
min = int(n1 * n2 / max)
print(f'{n1}와 {n2}의 공약수 : {list}')
print(f'{n1}와 {n2}의 최대공약수 : {max}')
print(f'{n1}와 {n2}의 최소공배수 : {min}')
3개이상일때는 2가지의 최소공배수를 구하고
그 최소공배수와 나머지 하나의 최소공배수를 구한다.
ship1 = 3
ship2 = 4
ship3 = 5
max_day = 0
#ship1과 ship2의 최소공배수구하기
for i in range (1,ship1+1) :
if ship1 % i == 0 and ship2 % i == 0 :
max_day = i
print(f'{ship1},{ship2}의 최대공약수 : {max_day}')
min_day = ( ship1 * ship2 ) // max_day
print(f'{ship1},{ship2}의 최소공배수 : {min_day}')
for i in range (1,min_day+1) :
if min_day % i == 0 and ship3 % i == 0 :
max_day = i
print(f'{ship1},{ship2},{ship3}의 최대공약수 : {max_day}')
min_day = ( min_day * ship3 ) // max_day
print(f'{ship1},{ship2},{ship3}의 최소공배수 : {min_day}')
import random
rnum1 = random.randint(100,1000)
rnum2 = random.randint(100,1000)
print(f'rnum1 : {rnum1}')
print(f'rnum2 : {rnum2}')
max_num = 0
for i in range(1,min(rnum1,rnum2)):
if rnum1 % i == 0 and rnum2 % i == 0 :
print (f'공약수 : {i}')
max_num = i
print(f'최대공약수 : {max_num}')
min_num = (rnum1*rnum2) // max_num
print(f'최소공배수 : {min_num}')