[Zerobase][기초수학] 약수, 소수, 최대공약수/최소공배수

솔비·2023년 12월 7일

💻 Python. w/zerobase

목록 보기
20/33
post-thumbnail

기초수학 w/python

1. 약수와 소수

A. 약수

어떤 수를 나누어 떨어지게 하는 수
e.g. 2의 약수 : 1,2 / 8의 약수 : 1,2,4,8

📁 Python 활용법

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}')

B. 소수

1과 자기 자신만을 약수로 가지는 수 (1제외)
e.g. 2,3,5,7,9,11,13,17,19,23 ...

📁 Python 활용법

소수는 자기자신보다 작은 수 들로 나눴을 때
나머지가 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}')

2. 소인수분해

A. 소인수

인수(약수)중에서 소수인 수

e.g.
12의 약수 : 1,2,3,4,6,12
12의 약수에서 소수 : 2,3
12의 소인수 : 2,3

📁 Python 활용법

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}')

B. 소인수분해

e.g.
20 : 2*10
10 : 5*2

20 : 2*2*5 = 2^2*5

📁 Python 활용법

소인수 분해는 우선 대상 수를 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}')

C. 소인수분해와 약수

소인수 분해를 통해 약수를 알 수 있다.

📁 Python 활용법

# 사용자 입력수에 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

3. 최대공약수

공약수 : 공통된 약수
최대공약수 : 공통된 약수 중 가장 큰 수

공약수 <> 최대공약수

공약수 -> 최대공약수 : 공약수 중 가장 큰것
최대공약수 -> 공약수 : 최대공약수의 약수

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

A. 소인수분해 <> 최대공약수

소인수분해 후 공통 지수를 곱한다.

e.g.
36의 소인수분해 : 2*2*3*3
60의 소인수분해 : 2*2*3*5

최대공약수 : 2*2*3 = 12

📁 Python 활용법

#두개의 수를 입력하면 공약수와 최대공약수를 출력하는 코드를 작성
# -> 두 수의 공통 약수중 가장 큰 수

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)}')

B. 유클리드 호제법

x,y 의 최대공약수는 y와 r(x % y)의 최대공약수와 같다.

📁 Python 활용법

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}는 서로소이다.')

4. 최소공배수

공배수 : 공통된 배수
최소공배수 : 공통된 배수 중 가장 작은 수

A. 소인수분해 <> 최소공배수

공통인 소인수의 거듭제곱에서 지수가 크고 공통이 아닌 수를 모두 곱한다.

10의 소인수분해 : 2*5
25의 소인수분해 : 5*5

공통이 아닌수 : 2
지수가 큰것 : 5^2
최소공배수 : 2*5^2 = 50

📁 Python 활용법

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}')

제로베이스 데이터취업스쿨
Daily Study Note
profile
Study Log

0개의 댓글