Python 실습(소인수, 최대공약수, 최소공배수, 진법)

dumbbelldore·2024년 11월 11일
0

zero-base 33기

목록 보기
20/97

1. 약수, 소수, 소인수 출력 프로그램

  • 100부터 1,000 사이의 난수를 추출하여 해당 숫자에 대한 약수, 소수, 그리고 소인수를 출력하는 프로그램을 만드시오.
import random

target_num = random.randint(100, 1000)
print(f"> 추출된 번호: {target_num:,d}")

# 약수
divisor_list = list()

for i in range(1, target_num + 1):
    
    if target_num % i == 0:
        divisor_list.append(i)
        
print(f"> {target_num:,d}의 약수 ({len(divisor_list)}개): {divisor_list}")

# 소수
prnumber_list = list()

for i in range(2, target_num + 1):
    
    flag = True
    
    for j in range(2, i):
        if i % j == 0:
            flag = False
    
    if flag:
        prnumber_list.append(i)

print(f"> {target_num:,d}의 소수 ({len(prnumber_list)}개): {prnumber_list}")      


# 소인수
prfactor_list = [num for num in prnumber_list if num in divisor_list]
print(f"> {target_num:,d}의 소인수 ({len(prfactor_list)}개): {prfactor_list}") 

# 출력결과
# > 추출된 번호: 143
# > 143의 약수 (4개): [1, 11, 13, 143]
# > 143의 소수 (34개): [2, 3, 5, 7, 11, (중략) 137, 139]
# > 143의 소인수 (2개): [11, 13]

2. 소인수 지수 출력 프로그램

  • 100부터 1,000 사이의 난수를 추출하여 소인수분해를 수행하고, 각 소인수에 대한 지수를 출력하는 프로그램을 만드시오.
import random

target_num = random.randint(100, 1000)
print(f"> 추출된 번호: {target_num:,d}")

i = 2
prnumber_list = list()

while i <= target_num:
    if target_num % i == 0:
        prnumber_list.append(i)
        target_num /= i
    
    else:
        i += 1

print(f"> 소인수 리스트: {prnumber_list}")

temp = 0
for num in prnumber_list:
    if num != temp:
        print(f"> {num}의 지수: {prnumber_list.count(num)}")
        temp = num
    
    else:
        continue

# 실행 결과
# > 추출된 번호: 735
# > 소인수 리스트: [3, 5, 7, 7]
# > 3의 지수: 1
# > 5의 지수: 1
# > 7의 지수: 2

3. 공약수, 최대공약수, 서로소 출력 프로그램

  • 100부터 1,000 사이의 난수를 2개 추출하여 공약수, 최대공약수를 추출하고 두 난수가 서로소인지 알려주는 프로그램을 만드시오.
import random

target_num1 = random.randint(100, 1000)
target_num2 = random.randint(100, 1000)
print(f"> 추출된 번호: {target_num1:,d}, {target_num2:,d}")

# 공약수
comdiv_list = list()

for i in range(1, min(target_num1, target_num2)+1):
    if target_num1 % i ==0 and target_num2 % i == 0:
        comdiv_list.append(i)
print(f"> 공약수 리스트: {comdiv_list}")

# 최대공약수
max_comdiv = max(comdiv_list)
print(f"> 최대공약수: {max_comdiv}")

# 서로소
if max_comdiv == 1:
    print(f"> {target_num1:,d}, {target_num2:,d}는 서로소입니다.")

else:
    print(f"> {target_num1:,d}, {target_num2:,d}는 서로소가 아닙니다.")

# 출력결과
# > 추출된 번호: 692, 747
# > 공약수 리스트: [1]
# > 최대공약수: 1
# > 692, 747는 서로소입니다.
#
# > 추출된 번호: 836, 902
# > 공약수 리스트: [1, 2, 11, 22]
# > 최대공약수: 22
# > 836, 902는 서로소가 아닙니다.

4. 최대공약수, 최소공배수 출력 프로그램

  • 100부터 1,000 사이의 난수를 2개 추출하여 최대공약수와 최소공배수를 출력하는 프로그램을 만드시오.
import random

target_num1 = random.randint(100, 1000)
target_num2 = random.randint(100, 1000)
print(f"> 추출된 번호: {target_num1:,d}, {target_num2:,d}")

# 최대공약수
comdiv_list = list()

for i in range(1, min(target_num1, target_num2)+1):
    if target_num1 % i ==0 and target_num2 % i == 0:
        comdiv_list.append(i)
        
max_comdiv = max(comdiv_list)
print(f"> 최대공약수: {max_comdiv}")

# 최소공배수
min_commul = target_num1 * target_num2 // max_comdiv
print(f"> 최소공배수: {int(min_commul)}")

# 출력결과
# > 추출된 번호: 704, 143
# > 최대공약수: 11
# > 최소공배수: 9152

5. 진법

  • 사용자로부터 하나의 값과 진법을 입력받은 뒤, 10진수로 변환하여 출력해주는 프로그램을 만드시오.
user_value = input("변환할 값을 입력하세요: ")
from_method = int(input("변환할 값의 진법을 선택하세요 (2. 2진수, 8. 8진수, 16. 16진수): "))

if from_method == 2:
    user_value = "0b" + user_value
    return_value = int(user_value, 2)
elif from_method == 8:
    user_value = "0o" + user_value
    return_value = int(user_value, 8)
elif from_method == 16:
    user_value = "0x" + user_value
    return_value = int(user_value, 16)
else:
    raise ValueError("정확한 진법을 선택하세요.")
    
print(f"{user_value}({from_method}) => {return_value}(10)")

# 출력결과
# 변환할 값을 입력하세요: 11011
# 변환할 값의 진법을 선택하세요 (2. 2진수, 8. 8진수, 16. 16진수): 2
# 0b11011(2) => 27(10)

*이 글은 제로베이스 데이터 취업 스쿨의 강의 자료 일부를 발췌하여 작성되었습니다.

profile
데이터 분석, 데이터 사이언스 학습 저장소

0개의 댓글