[Zerobase][기초수학] 약수, 소수, 최대공약수/최소공배수 문제풀이

솔비·2023년 12월 7일

💻 Python. w/zerobase

목록 보기
21/33
post-thumbnail

⬇️ 약수, 소수, 최대공약수/최소공배수 이론


약수, 소수, 소인수


📖 1번문제

100부터 1000사이의 난수에 대해서 약수, 소수, 그리고 소인수를 출력하는 프로그램을 만들어보자

import random

rnum = random.randint(100,1000)
list = []
list_soinsu = []
sosu = ''

#약수
for i in range(1,rnum+1) :
    if rnum % i == 0 :
        list.append(i)

#소수
for i in range(2,rnum) :
    flag = True
    if rnum % i == 0 :
        flag = False
        break

if flag == True :
    sosu = '소수'
else :
    sosu = '합성수'
    
#소인수
for i in list :
    flag = True
    if i != 1:
        for r in range(2,i):
            if i % r == 0 :
                flag = False
                break

        if flag == True :
            list_soinsu.append(i)

print(f'{rnum}의 약수 : {list}')
print(f'{rnum}의 소인수 : {list_soinsu}')
print(f'{rnum}는 : {sosu}')

📁 풀이기록

rnum의 약수의 경우 1부터 rnum 까지의 숫자 중 rnum으로 나눠지는 수를 리스트에 담아 출력
rnum의 소수 판별의 경우 2부터 rnum-1 까지의 숫자를 rnum에 나눴을 때
나눠지지 않을 경우 소수, 나눠질 경우 합성수를 변수에 담아 출력
rnum의 소인수 리스트의 경우 rnum 리스트에서 소수인 수를 별도로 담아 출력


📖 2번문제

100부터 1000사이의 난수를 소인수분해하고
각각의 소인수에 대한 지수를 출력하는 프로그램을 만들어보자

import random

rnum = random.randint(100,1000)
soinsu_list = []

temp = rnum
n = 2
while n <= temp :
    if temp % n == 0 :
        soinsu_list.append(n)
        temp /= n

    else :
        n += 1

print(f'{rnum}의 소인수분해 : {soinsu_list}')

jisoo = {}
for i in soinsu_list :
    cnt = soinsu_list.count(i)
    jisoo[i] = cnt


for key, item in jisoo.items() :
    print(f'{key}의 지수 : {item}')

📁 풀이기록

소인수 분해의 경우 2부터 나눠서 나눠질경우 리스트에 담고
나눠지지 않을 경우 +1를 해주어서 rnum이 0이 될 때까지 반복한 뒤 해당 리스트를 출력하고
지수의 경우 count 메소드를 활용하여 딕셔너리에 담아서 출력하였다.

위 1번문제와 2번문제 모두
파이썬 기술적 역량보다는 약수, 소수, 소인수에 대한 기초지식이 요구된다.


최대공배수/최소공배수


📖 1번문제

100부터 1000사이의 2개의 난수에 대해서 공약수와 최대공약수를 출력하고
서로소(1외에 공약수가 없는 수)인지 출력하는 프로그램

import random

while True :
    rnum1 = random.randint(100,1000)
    rnum2 = random.randint(100,1000)

    if rnum1 != rnum2 :
        break

#공약수
list = []
for i in range(1,min(rnum1,rnum2)+1) :
    if rnum1 % i == 0 and rnum2 % i == 0 :
        list.append(i)

print(f'{rnum1},{rnum2}의 공약수 : {list}')

#최대공약수
max = max(list)

print(f'{rnum1},{rnum2}의 최대공약수 : {max}')

if max == 1 :
    print(f'{rnum1},{rnum2}은 서로소')
else :
    print(f'{rnum1},{rnum2}은 서로소 아님')

📁 풀이기록

약수 구하는 공식을 그대로 넣어서 두 난수의 공약수를 구한 뒤
max()함수를 이용하여 최대공약수를 구했다.
if 문으로 최대공약수가 1일 경우 서로소
아닐경우 서로소 아님 이라는 문구도 출력하였다.


📖 2번문제

100부터 1000사이의 2개의 난수에 대해서 최소공배수와 최대공약수를 출력하는 프로그램

import random

while True :
    rnum1 = random.randint(100,1000)
    rnum2 = random.randint(100,1000)

    if rnum1 != rnum2 :
        break


list = []

for i in range(1,min(rnum1,rnum2)+1) :
    if rnum1 % i == 0 and rnum2 % i == 0:
        list.append(i)


max = max(list)
print(f'{rnum1}{rnum2}의 최대공약수 : {max}')

min = int(rnum1 * rnum2 / max)
print(f'{rnum1}{rnum2}의 최소공배수 : {min}')

📁 풀이기록

최소공배수 = num1 * num2 / 최대공약수
공식을 이용하면 쉽게 풀 수 있다.


Zero Base 데이터분석 스쿨
Daily Study Note
profile
Study Log

0개의 댓글