
⬇️ 약수, 소수, 최대공약수/최소공배수 이론
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 리스트에서 소수인 수를 별도로 담아 출력
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번문제 모두
파이썬 기술적 역량보다는 약수, 소수, 소인수에 대한 기초지식이 요구된다.
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일 경우 서로소
아닐경우 서로소 아님 이라는 문구도 출력하였다.
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 / 최대공약수
공식을 이용하면 쉽게 풀 수 있다.