
약수는 어떤 수를 나누어 떨어지게 하는 수이다.
입력된 수를 1부터 입력수까지 for문을 돌며 나누어 나머지가 0인 수를 찾는다.
def Divisor(inputNum):
divisors = []
for number in range(1, (inputNum + 1)):
# 나머지가 0인 숫자 찾기
if inputNum % number == 0:
divisors.append(number)
return divisors
소수는 1과 그 수 자신만을 약수로 가지는 수이다.
단, 1은 소수에 포함되지 않는다.
2부터 입력된 수까지 차례대로 돌면서 존재하는 소수를 찾는다.
각 수(n)를 2부터 (n-1)까지 하나하나 나누었을 때 나누어 떨어지는 수가 있으면 자기자신(n)말고도 약수가 존재하므로 소수가 아니다.
소수는 2를 제외하고 모두 홀수이므로 소수 판단은 홀수만 한다.
def primeNumber(input_num):
primes = []
for number in range(1, (input_num + 1), 2):
# 소수의 유일한 짝수는 2!!
if number == 1: number += 1
flag = True
for i in range(2, number):
if number % i == 0:
flag = False
break
if flag: primes.append(number)
return primes
약수(인수)이면서 동시에 소수인 수

inputNumber = int(input('1보다 큰 정수 입력: '))
n = 2
while n <= inputNumber:
if inputNumber % n == 0:
print('소인수: {}'.format(n))
inputNumber /= n 👈 #소인수분해 원리
else:
n += 1두 개 이상의 수에서 공통된 약수(공약수) 중 가장 큰 수
공약수는 2개 이상의 수에 동시에 나누어 떨어지는 수를 구하면 된다.
공약수는 비교하는 수 중 가장 작은 수보다 클 수 없다.
# 수 세개의 최대공약수
num1 = int(input('1보다 큰 정수 입력: '))
num2 = int(input('1보다 큰 정수 입력: '))
num3 = int(input('1보다 큰 정수 입력: '))
min_num = min(num1, num2, num3)
gcd = 0
for i in range(1, (min_num + 1)):
if num1 % i == 0 and num2 % i == 0 and num3 % i == 0:
print('공약수: {}'.format(i))
gcd = i
print('최대공약수: {}'.format(gcd))
유클리드 호제법을 이용해 최대공약수를 구할 수 있다.
유클리드 호제법이란?
두 정수 a, b의 최대공약수를 G(a, b)라고할 때,
정수 a, b, Q(몫), R(나머지) (b != 0, a > b)에 대하여
a = bQ + R이면 G(a, b) = G(b, r)이 성립한다는 이론이다.
재귀함수를 이용해 b자리 나머지가 0일 때까지 진행한다.
def Euclidean(a, b):
if b == 0: return a
return Euclidean(b, (a % b))
두 개 이상의 수에서 공통된 배수(공배수) 중 가장 작은 수
최소공배수는 최대공약수를 먼저 구한 후 연산으로 구할 수 있다.
두 수의 곱을 최대공약수로 나눈 몫이 최소공배수이다.
#수 두개의 최소공배수
num1 = int(input('1보다 큰 정수 입력: '))
num2 = int(input('1보다 큰 정수 입력: '))
gcd = 0
# 둘 중 작은 수만큼만 for문을 돌면 된다.
for i in range(1, (num1 + 1)):
if num1 % i == 0 and num2 % i == 0:
gcd = i
print('최대공약수: {}'.format(gcd))
lcm = (num1 * num2) // gcd ⭐
print('최소공배수: {}'.format(lcm))
진법은 자릿수 체계로 표시하는 기수(Radix)의 종류와 그 기수의 위치(i)에 따라 결정된다.
기수(radix)는 수를 나타내는 데 기초가 되는 수로 진법 체계의 기준이 된다. ex> 2진수, 8진수, 10진수, 16진수, 등
10진수를 2(binary), 8(octal), 16(hexadecimal) 진법으로 변환
bin(), oct(), hex() 함수는 문자열 자료형으로 값을 반환한다.
dNum = 30
# 10진수 -> X진수
print(' 2진수: {}'.format(bin(dNum))) # 2진수: 0b11110
print(' 8진수: {}'.format(oct(dNum))) # 8진수: 0o36
print('16진수: {}'.format(hex(dNum))) #16진수: 0x1e
print('Type of bin(dNum): {}'.format(type(bin(dNum))))
print('Type of oct(dNum): {}'.format(type(oct(dNum))))
print('Type of oct(dNum): {}'.format(type(hex(dNum))))
#Type of bin(dNum): <class 'str'>
#Type of oct(dNum): <class 'str'>
#Type of oct(dNum): <class 'str'>
2, 8, 16진수를 10진수로 변환
# X진수 -> 10진수
print('2진수(0b11110) -> 10진수({})'.format(int(0b11110)))
print('8진수(0o36) -> 10진수({})'.format(int(0o36)))
print('16진수(0x1e) -> 10진수({})'.format(int(0x1e)))
문자열로 데이터를 입력하는 경우 Radix를 명시해준다.
print('2진수(0b11110) -> 10진수({})'.format(int('0b11110', 2)))
print('8진수(0o36) -> 10진수({})'.format(int('0o36', 8)))
print('16진수(0x1e) -> 10진수({})'.format(int('0x1e', 16)))
# 2진수(0b11110) -> 10진수(30)
# 8진수(0o36) -> 10진수(30)
#16진수(0x1e) -> 10진수(30)
format() 함수는 형식문자(‘#b’ ‘#o’ ‘#x’)를 사용한다.
# 10진수 -> X진수(format()함수 이용)
print(' 2진수: {}'.format(format(dNum, '#b'))) # 2진수: 0b11110
print(' 8진수: {}'.format(format(dNum, '#o'))) # 8진수: 0o36
print('16진수: {}'.format(format(dNum, '#x'))) # 16진수: 0x1e
format() 함수는 문자열 자료형으로 값을 반환한다.
print('Type of bin(dNum): {}'.format(type(format(dNum, '#b'))))
print('Type of oct(dNum): {}'.format(type(format(dNum, '#o'))))
print('Type of oct(dNum): {}'.format(type(format(dNum, '#x'))))
# Type of bin(dNum): <class 'str'>
# Type of oct(dNum): <class 'str'>
# Type of oct(dNum): <class 'str'>
상징문자(0b, 0o, 0x) 없이 출력할 수 있다.
print('2진수: {0:b}, 8진수: {0:o}, 16진수: {0:x}'.format(dNum))
# 2진수: 11110, 8진수: 36, 16진수: 1e