본문 바로가기

2. 정보영재교육 수업 자료

[448] 약수 학습하기

1. 개념 소개

여러분, 약수라는 말을 들어본 적이 있나요? 약수란 어떤 수를 나누어떨어지게 만드는 숫자입니다. 쉽게 말하면, 어떤 수를 나누었을 때 나머지가 0이 되면, 그 숫자는 약수라고 할 수 있습니다.

 

예를 들어, 12라는 숫자를 생각해 보겠습니다.

1로 나누면 12 ÷ 1 = 12 (나머지 0, 약수입니다!)

2로 나누면 12 ÷ 2 = 6 (나머지 0, 약수입니다!)

3로 나누면 12 ÷ 3 = 4 (나머지 0, 약수입니다!)

4로 나누면 12 ÷ 4 = 3 (나머지 0, 약수입니다!)

 

이렇게 12를 나누었을 때 나머지가 0이 되는 숫자들은 모두 12의 약수입니다.

2. 실생활 예제

 

약수는 우리 일상에서도 쉽게 찾아볼 수 있습니다. 예를 들어, 초콜릿 12개가 들어 있는 상자가 있다고 생각해 보겠습니다. 이 초콜릿을 똑같이 나누어 친구들과 나누려면 어떻게 해야 할까요?

2명이서 나누면, 한 사람당 6개씩 받을 수 있습니다. (2는 12의 약수입니다!)

3명이서 나누면, 한 사람당 4개씩 받을 수 있습니다. (3은 12의 약수입니다!)

4명이서 나누면, 한 사람당 3개씩 받을 수 있습니다. (4도 12의 약수입니다!)

6명이서 나누면, 한 사람당 2개씩 받을 수 있습니다. (6 역시 12의 약수입니다!)

 

이렇게 초콜릿을 똑같이 나눌 수 있는 사람의 수가 바로 약수입니다. 나머지 없이 딱 맞게 나눌 수 있으면, 그 숫자는 약수라고 할 수 있습니다!

3. 간단한 파이썬 코드

기본 약수 찾기 코드

# 어떤 수의 약수를 찾는 프로그램

# 숫자를 입력받습니다.
number = int(input("약수를 찾고 싶은 숫자를 입력하세요: "))

print(f"{number}의 약수는 다음과 같습니다:")

# 1부터 입력한 숫자까지 반복하면서 약수를 찾습니다.
for i in range(1, number + 1):
    if number % i == 0:
        print(i)

코드 설명:

input() 함수를 사용해 숫자를 입력받고, for 반복문을 통해 1부터 입력한 숫자까지 나눠서 나머지가 0인 경우에만 약수로 출력합니다.

더 효율적인 약수 찾기 코드

# 더 효율적인 약수 찾기 프로그램
import math  # 제곱근을 계산하기 위해 math 모듈을 사용합니다.

# 숫자를 입력받습니다.
number = int(input("약수를 찾고 싶은 숫자를 입력하세요: "))

print(f"{number}의 약수는 다음과 같습니다:")

# 약수를 저장할 리스트 생성
divisors = []

# 1부터 제곱근까지 반복하면서 약수를 찾습니다.
# math.isqrt(number)는 number의 '정수 제곱근'을 반환합니다.
# 예를 들어, math.isqrt(12)는 3을 반환합니다 (3*3=9, 4*4=16이므로 3까지만 확인).
for i in range(1, int(math.isqrt(number)) + 1):
    if number % i == 0:
        divisors.append(i)             # 작은 약수 추가
        if i != number // i:           # 짝이 되는 큰 약수 추가 (중복 방지)
            divisors.append(number // i)

# 약수를 오름차순으로 정렬하여 출력합니다.
divisors.sort()
for divisor in divisors:
    print(divisor)

math.isqrt() 함수 설명:

**math.isqrt(number)**는 **‘정수 제곱근’**을 반환하는 함수입니다.

예를 들어, **math.isqrt(12)**는 3을 반환합니다. 이는 3²=9이고, 4²=16이므로 12의 제곱근은 3보다 크고 4보다 작기 때문입니다.

정수 제곱근까지만 반복하면 불필요한 계산을 줄이고 더 빠르게 약수를 찾을 수 있습니다.

4. 연습 문제

문제 1:

여러분이 좋아하는 숫자를 하나 정하고, 그 숫자의 약수를 모두 찾아보세요!

예: 24의 약수를 모두 찾으세요.

예시 코드:

# 숫자의 약수 찾기
number = int(input("약수를 찾고 싶은 숫자를 입력하세요: "))

print(f"{number}의 약수는 다음과 같습니다:")
for i in range(1, number + 1):
    if number % i == 0:
        print(i)

답:

24의 약수는 1, 2, 3, 4, 6, 8, 12, 24입니다.

문제 2:

1부터 50까지 숫자 중에서 **약수가 2개뿐인 숫자(소수)**를 찾아보세요.

예시 코드:

# 1부터 50까지의 소수 찾기
for number in range(1, 51):
    divisor_count = 0  # 약수 개수 초기화
    for i in range(1, number + 1):
        if number % i == 0:
            divisor_count += 1  # 약수일 때마다 개수 증가
    if divisor_count == 2:
        print(number)

답:

1부터 50까지의 소수는 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47입니다.

문제 3:

아래에 있는 두 숫자의 약수를 모두 구하고, 공통된 약수를 찾아보세요.

예: 1824의 약수를 구한 뒤, 두 수의 공통 약수를 찾으세요.

보너스: 두 수의 **최대공약수(GCD)**는 무엇인가요?

예시 코드:

# 두 숫자의 공통 약수 찾기
num1 = int(input("첫 번째 숫자를 입력하세요: "))
num2 = int(input("두 번째 숫자를 입력하세요: "))

divisors_num1 = [i for i in range(1, num1 + 1) if num1 % i == 0]
divisors_num2 = [i for i in range(1, num2 + 1) if num2 % i == 0]

# 공통 약수 찾기
common_divisors = [i for i in divisors_num1 if i in divisors_num2]

print(f"{num1}의 약수: {divisors_num1}")
print(f"{num2}의 약수: {divisors_num2}")
print(f"공통된 약수: {common_divisors}")

# 최대공약수(GCD) 출력
print(f"{num1}과 {num2}의 최대공약수(GCD): {max(common_divisors)}")

답:

18의 약수: 1, 2, 3, 6, 9, 18

24의 약수: 1, 2, 3, 4, 6, 8, 12, 24

공통된 약수: 1, 2, 3, 6

최대공약수(GCD): 6

문제 4 (코딩 활동):

여러분이 배운 파이썬 코드를 활용해, 1부터 100까지의 숫자 중 약수가 가장 많은 숫자를 찾아보세요.

약수가 몇 개인지도 함께 출력해 보세요!

예시 코드:

# 1부터 100까지 약수가 가장 많은 숫자 찾기
max_divisors_count = 0
number_with_max_divisors = 0

for number in range(1, 101):
    divisors = [i for i in range(1, number + 1) if number % i == 0]
    if len(divisors) > max_divisors_count:
        max_divisors_count = len(divisors)
        number_with_max_divisors = number

print(f"1부터 100까지 중 약수가 가장 많은 숫자는 {number_with_max_divisors}입니다.")
print(f"약수의 개수: {max_divisors_count}")

답:

60은 약수가 가장 많은 숫자 중 하나이며, 약수의 개수는 12개입니다.

60의 약수: 1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30, 60