수학개념 20개 + 순수 파이썬 코드 + 주석 + 한 줄 설명 + OX 퀴즈 + 5지선다형 문제
변수, if, for, while, list, %, //, **, break
어떤 수를 나누어떨어지게 하는 수를 약수라고 합니다.
n = 24 # 약수를 구할 수
for i in range(1, n + 1): # 1부터 n까지 하나씩 검사한다.
if n % i == 0: # n을 i로 나눈 나머지가 0이면
print(i) # i는 n의 약수이다.
어떤 수에 정수를 곱해서 얻는 수를 배수라고 합니다.
n = 7 # 기준 수
for i in range(1, 11): # 1부터 10까지 반복한다.
print(n * i) # n에 i를 곱해 배수를 출력한다.
약수가 몇 개인지 세는 것은 수의 구조를 파악하는 기본 방법입니다.
n = 36 # 약수의 개수를 구할 수
count = 0 # 약수 개수 저장
for i in range(1, n + 1):
if n % i == 0: # i가 약수이면
count += 1 # 약수 개수를 1 증가시킨다.
print("약수의 개수:", count)
모든 약수를 더하면 완전수, 친화수 등 여러 수학 개념과 연결됩니다.
n = 28 # 약수의 합을 구할 수
total = 0 # 약수의 합
for i in range(1, n + 1):
if n % i == 0: # i가 약수이면
total += i # 약수를 합에 더한다.
print("약수의 합:", total)
자기 자신을 제외한 약수를 진약수라고 합니다.
n = 28 # 진약수를 구할 수
for i in range(1, n): # 자기 자신 n은 제외한다.
if n % i == 0: # 나누어떨어지면
print(i) # 진약수 출력
자기 자신을 제외한 약수의 합이 자기 자신과 같으면 완전수입니다.
n = 28 # 완전수인지 판별할 수
total = 0 # 진약수의 합
for i in range(1, n):
if n % i == 0:
total += i # 진약수를 더한다.
if total == n:
print("완전수")
else:
print("완전수 아님")
두 수를 모두 나누어떨어지게 하는 수를 공약수라고 합니다.
a = 24
b = 36
for i in range(1, min(a, b) + 1): # 두 수 중 작은 수까지만 검사
if a % i == 0 and b % i == 0: # 두 수 모두 나누어떨어지면
print(i) # 공약수 출력
두 수의 배수에 공통으로 들어가는 수를 공배수라고 합니다.
a = 4
b = 6
count = 0 # 찾은 공배수 개수
i = 1 # 검사할 수
while count < 5: # 공배수 5개를 찾을 때까지 반복
if i % a == 0 and i % b == 0: # 두 수의 배수이면
print(i) # 공배수 출력
count += 1
i += 1 # 다음 수 검사
공약수 중 가장 큰 수를 최대공약수라고 합니다.
a = 48
b = 18
gcd = 1 # 최대공약수 저장
for i in range(1, min(a, b) + 1):
if a % i == 0 and b % i == 0:
gcd = i # 더 큰 공약수가 나오면 갱신된다.
print("최대공약수:", gcd)
두 수의 최대공약수를 빠르게 구하는 대표적인 알고리즘입니다.
a = 48
b = 18
while b != 0: # 나머지가 0이 될 때까지 반복
a, b = b, a % b # b와 나머지로 갱신
print("최대공약수:", a)
공배수 중 가장 작은 수를 최소공배수라고 합니다.
a = 12
b = 18
x = a
y = b
while y != 0: # 최대공약수 구하기
x, y = y, x % y
gcd = x
lcm = a * b // gcd # 최소공배수 공식
print("최소공배수:", lcm)
1과 자기 자신만을 약수로 가지는 2 이상의 자연수를 소수라고 합니다.
n = 29
is_prime = True # 처음에는 소수라고 가정한다.
if n < 2:
is_prime = False # 2보다 작은 수는 소수가 아니다.
else:
for i in range(2, n):
if n % i == 0: # 중간 약수가 있으면
is_prime = False
break
print("소수" if is_prime else "소수 아님")
소수 판별은 제곱근까지만 검사해도 충분합니다.
n = 97
is_prime = True
if n < 2:
is_prime = False
else:
for i in range(2, int(n ** 0.5) + 1): # 제곱근까지만 검사
if n % i == 0:
is_prime = False
break
print("소수" if is_prime else "소수 아님")
범위 안에 있는 소수를 모두 찾을 수 있습니다.
limit = 50 # 50까지의 소수를 찾는다.
for n in range(2, limit + 1):
prime = True
for i in range(2, int(n ** 0.5) + 1):
if n % i == 0:
prime = False
break
if prime:
print(n, end=" ")
어떤 범위 안에 소수가 몇 개 있는지 셀 수 있습니다.
limit = 100
count = 0 # 소수 개수
for n in range(2, limit + 1):
prime = True
for i in range(2, int(n ** 0.5) + 1):
if n % i == 0:
prime = False
break
if prime:
count += 1 # 소수 개수 증가
print("소수 개수:", count)
범위 안의 소수를 효율적으로 찾는 고전 알고리즘입니다.
n = 50
sieve = [True] * (n + 1) # 처음에는 모두 소수라고 가정
sieve[0] = False
sieve[1] = False
for i in range(2, int(n ** 0.5) + 1):
if sieve[i]: # i가 소수이면
for j in range(i * i, n + 1, i): # i의 배수 제거
sieve[j] = False
for i in range(2, n + 1):
if sieve[i]:
print(i, end=" ")
자연수를 소수들의 곱으로 나타내는 과정입니다.
n = 84
i = 2
while i <= n:
if n % i == 0: # i로 나누어떨어지면
print(i, end=" ") # i는 소인수
n //= i # n을 i로 나눈 몫으로 바꿈
else:
i += 1 # 나누어떨어지지 않으면 다음 수 검사
같은 소인수가 여러 번 나오면 지수 형태로 표현할 수 있습니다.
n = 84
original = n
i = 2
result = []
while i * i <= n:
count = 0 # i가 몇 번 나오는지 세기
while n % i == 0:
n //= i
count += 1
if count == 1:
result.append(str(i))
elif count > 1:
result.append(f"{i}^{count}")
i += 1
if n > 1:
result.append(str(n))
print(original, "=", " × ".join(result))
두 수의 최대공약수가 1이면 서로소라고 합니다.
a = 35
b = 18
x = a
y = b
while y != 0:
x, y = y, x % y
if x == 1:
print("서로소")
else:
print("서로소 아님")
곱해서 n이 되는 두 수의 쌍을 약수쌍이라고 볼 수 있습니다.
n = 36
for i in range(1, int(n ** 0.5) + 1): # 제곱근까지만 검사
if n % i == 0:
print(i, n // i) # i와 n//i는 약수쌍
n % i == 0의 의미는?% 나머지 연산, // 정수 나눗셈, for 반복문, while 반복문, break, 리스트 활용