약수 / 소수
# 사용자가 입력한 숫자의 약수를 출력
inputNum = int(input('0보다 큰 정수 입력: '))
for i in range(1, (inputNum + 1)):
if inputNum % i == 0: # 나눠떨어지면 약수
print(f'{inputNum}의 약수: {i}')
Python
복사
# 사용자가 입력한 숫자까지의 소수 찾기
inputNum = int(input('0보다 큰 정수 입력: '))
for num in range(2,(inputNum + 1)):
flag = True
for n in range(2,num):
if num % n == 0:
flag = False
break
if flag:
print(f'{num}: 소수!')
else:
print(f'{num}: 합성수!')
Python
복사
소인수분해
말 그대로, 소인수 : 소수 + 약수라서
약수 중에서 소수인 숫자를 소인수라고 보면 된다.
따라서 소인수 분해는
어떤 수를 소인수로 분해하는 것을 말한다.
❗️소인수분해를 이용해서 약수를 정확하고 쉽게 구할 수 있다.
# 입력한 수를 소인수분해하자.
inputNum = int(input('1보다 큰 정수 입력: '))
n = 2
while n <= inputNum:
if inputNum % n == 0:
print(f'소인수 : {n}')
inputNum /= n
else:
n += 1
Python
복사
# 72에 x를 곱하면 y의 제곱이 된다고 할 때, x에 해당하는 가장 작은 정수를 구하자.
inputNum = int(input('1보다 큰 정수 입력: '))
n = 2
numlist = []
while n <= inputNum:
if inputNum % n == 0:
print(f'소인수 : {n}')
if numlist.count(n) == 0: # numlist 에 없고, 처음 나왔다면
numlist.append(n)
elif numlist.count(n) == 1: # 이미 들어있기 때문에, 그냥 신경쓸 필요 없다. -> 제거하자
numlist.remove(n)
inputNum /= n
else:
n += 1
print(f'searchNumber : {numlist}')
Python
복사
최대공약수
소인수분해를 이용하면 최대공약수 및 공약수를 구할 수 있다.
# 두 개의 수를 입력하면 공약수와 최대공약수를 출력하는 코드를 작성하자.
n1 = int(input('1보다 큰 정수 입력: '))
n2 = int(input('1보다 큰 정수 입력: '))
max_num = 0
for i in range(1, (n1 + 1)):
if n1 % i == 0 and n2 % i == 0:
print(f'공약수 : {i}')
max_num = i
print(f'최대공약수 : {max_num}')
Python
복사
# 세 개의 수를 입력하면 공약수와 최대공약수를 출력하는 코드
n1 = int(input('1보다 큰 정수 입력: '))
n2 = int(input('1보다 큰 정수 입력: '))
n3 = int(input('1보다 큰 정수 입력: '))
maxNum = 0
for i in range(1,(n1 + 1)):
if n1 % i == 0 and n2 % i == 0 and n3 % i == 0: # 세 값에 모두 나눠떨어지면 공약수
print(f'공약수 : {i}')
maxNum = i
print(f'최대공약수 : {maxNum}')
Python
복사
유클리드 호제법
유클리드 호제법을 이용해서 최대공약수를 구할 수 있다.
•
x, y의 최대공약수는 y와 (x%y) 의 최대공약수와 같다.
n1 = int(input('1보다 큰 정수 입력: '))
n2 = int(input('1보다 큰 정수 입력: '))
temp1 = n1
temp2 = n2
while temp2 > 0:
temp = temp2
temp2 = temp1 % temp2
temp1 = temp
print(f'{n1},{n2}의 최대공약수: {temp1}')
# 최대공약수를 가지고 공약수를 구하기
for n in range(1,(temp1 + 1)):
if temp1 % n == 0:
print(f'{n1}, {n2}의 공약수 : {n}')
Python
복사
최소공배수
•
최대공약수를 이용해서 최소공배수 구하기
# 두 개의 수를 입력하면 최소공배수를 출력하는 코드를 작성하자.
n1 = int(input('1보다 큰 정수 입력: '))
n2 = int(input('1보다 큰 정수 입력: '))
maxNum = 0
for i in range(1, (n1 + 1)):
if n1 % i == 0 and n2 % i == 0:
print(f'공약수 : {i}')
maxNum = i
print(f'최대공약수: {maxNum}')
minNum = (n1 * n2) // maxNum # 최소공배수
print(f'최소공배수: {minNum}')
Python
복사
# 세 개의 수를 입력하면 최소공배수를 출력하는 코드를 작성하자.
n1 = int(input('1보다 큰 정수 입력: '))
n2 = int(input('1보다 큰 정수 입력: '))
n3 = int(input('1보다 큰 정수 입력: '))
maxNum = 0
for i in range(1, (n1 + 1)):
if n1 % i == 0 and n2 % i == 0:
maxNum = i
print(f'최대공약수: {maxNum}')
minNum = (n1 * n2) // maxNum # 최소공배수
print(f'{n1}, {n2}의 최소공배수: {minNum}')
newNum = minNum
for i in range(1, (newNum + 1)):
if newNum % i == 0 and n3 % i == 0:
maxNum = i
print(f'최대공약수: {maxNum}')
minNum = (newNum * n3) // maxNum # 최소공배수
print(f'{n1}, {n2}, {n3}의 최소공배수: {minNum}')
Python
복사
진법
•
2진수 → 8진수 변환
•
2진수 → 16진수
파이썬에서의 진법 변환
•
10진수 → 2진수, 8진수, 16진수
◦
bin() : 2진수로 변환
◦
oct() : 8진수로 변환
◦
hex() : 16진수로 변환
•
이외에도 format() 함수로도 바꿀 수 있다.
dNum = 30
print('2진수: {}'.format(format(dNum, '#b'))) # 또는 '0b'를 빼고 출력하고 싶다면 'b' 만 써준다.
print('8진수: {}'.format(format(dNum, '#o'))) # 또는 'o'
print('16진수: {}'.format(format(dNum, '#x'))) # 또는 'x'
# 또는 아래와 같이 사용할 수도 있다.
print('{0:#b} , {0:#o}, {0:#x}'.format(dNum))
Python
복사
•
X진수 → 10진수
◦
int() 를 사용한다.
•
X진수 → X진수
◦
8진수로 변환 : oct()
◦
2진수로 변환 : bin()
◦
16진수로 변환 : hex()
등차수열
# 수열을 보고 n번째 항의 값을 출력하는 프로그램을 만들자.
inputN1 = int(input('a1 입력: '))
inputD = int(input('d 입력: '))
inputN = int(input('n 입력: '))
n = 1
result = 0
while n <= inputN:
# 항의 값을 구하기
result = inputN1 + (n - 1) * inputD
print(f'{n}번째 항의 값: {result}')
n += 1
Python
복사
# 등차수열의 n번째 항까지의 합을 구하는 프로그램을 만들자.
inputN1 = int(input('a1 입력: '))
inputD = int(input('d 입력: '))
inputN = int(input('n 입력: '))
n = 1
while n <= inputN:
# 첫째항과 끝항을 이용한 식으로 합을 구하자
sum = (inputN1 + (inputN1 + inputD * (n - 1))) * n / 2
print(f'{n}번째 항까지의 합: {int(sum)}')
n += 1
Python
복사
등비수열
# n번째 항의 값을 출력하는 프로그램. 등비수열
inputN1 = int(input('a1 입력: '))
inputR = int(input('r 입력: '))
inputN = int(input('n 입력: '))
n = 1
result = 1
while n <= inputN:
result = inputN1 * inputR ** (n-1)
print(f'{n}번째 항의 값: {result}')
n += 1
Python
복사
# n번째 항까지의 합을 구하는 프로그램
inputN1 = int(input('a1 입력: '))
inputR = int(input('r 입력: '))
inputN = int(input('n 입력: '))
n = 1
result = 1
sum = 0
while n <= inputN:
result = inputN1 * inputR ** (n-1) # n번째의 값
sum += result
print(f'{n}번째 항까지의 합: {sum}')
n += 1
# 등비수열의 합을 구하는 공식 활용하는 방법
# n번째 항까지의 합을 구하는 프로그램
result = inputN1 * (1 - (inputR ** inputN)) / (1 - inputR)
print(f'{inputN}번째까지의 등비수열 합: {int(result)}')
Python
복사
시그마
생략
계차 수열
두 항의 차로 이루어진 수열
# 계차수열의 n번째 항의 값을 출력하는 프로그램을 만들어보자.
inputAn1 = int(input('a1 입력: '))
inputAn = int(input('an 입력: ')) # n번째 항
inputBn1 = int(input('b1 입력: '))
inputBD = int(input('bn 공차 입력: '))
valueAn = 0
valueBn = 0
n = 1
while n <= inputAn:
if n == 1: # 1번째 항
valueAn = inputAn1
valueBn = inputBn1
print(f'an의 1번째 항의 값: {valueAn}')
print(f'bn의 1번째 항의 값: {valueBn}')
n += 1
continue
valueAn = valueAn + valueBn
valueBn = valueBn + inputBD
print(f'an의 {n}번째 항의 값: {valueAn}')
print(f'bn의 {n}번째 항의 값: {valueBn}')
n += 1
print(f'an의 {inputAn}번째 항의 값: {valueAn}')
print(f'bn의 {inputAn - 1}번째 항의 값: {valueBn}')
# 계차수열 항 구하기
bn = inputBn1 + (inputAn-1) * inputBD
Python
복사
# bn의 n-1 항까지의 합 - a1 을 계산하면 an의 값을 구할 수 있다.
inputAn1 = int(input('a1 입력: '))
inputAn = int(input('an 입력: ')) # n번째 항
inputBn1 = int(input('b1 입력: '))
inputBD = int(input('bn 공차 입력: '))
# inputBn1 + inputBD * (inputAn - 1) # b(n-1) 의 값
sumBn = (inputBn1 + inputBD * (inputAn - 1) + inputBn1) * (inputAn - 1) / 2 # b(n-1)까지의 합
An = sumBn - inputAn1 # an
Python
복사
피보나치 수열
세번째 항은 첫번째 항과 두번째 항을 더한 값이다.
이때, 적어도 두항은 있어야 한다.
1,2번째 항은 1이어야 한다.
# 다시!
Python
복사
팩토리얼
•
반복문을 사용하는 경우
# 팩토리얼
# 1.반복문
inputN = int(input('n 입력: '))
result = 1
for i in range(inputN,0,-1):
result *= i
print(f'{inputN} 팩토리얼: {result}')
# 또는
n = 1
result = 1
while n <= inputN:
result *= n
n += 1
print(f'{inputN} 팩토리얼: {result}')
Python
복사
•
재귀함수를 사용하는 경우
inputN = int(input('n 입력: '))
def factorialFun(n):
if n == 1: return 1
return n * factorialFun(n-1)
print(f'{inputN} 팩토리얼: {factorialFun(inputN)}')
Python
복사
# math 기능 활용하기
import math
print(math.factorial(inputN))
Python
복사
군 수열 → 다시!!
여러 개의 항을 묶었을 때 규칙성을 가지는 수열
intputN = int(input('n항 입력: '))
flag = True
n = 1; nCnt = 1; searchN = 0 # nCnt 는 n항의 숫자를 담는 변수, searchN은 해당 항의 값을 담는 변수
while flag:
for i in range(1, (n + 1)): # n은 군을 의미한다.
if i == n:
print('{} '.format(i), end='')
else:
print'{} ,'.format(i), end='')
nCnt += 1
if (nCnt > inputN):
searchN = i
flag = False
break
print()
n += 1
print('{}항 : {}'.format(inputN, searchN))
Python
복사
# 분모값 따로, 분자값 따로 만들어줘야 한다.
inputN = int(input('n항 입력: '))
flag = True
n = 1; nCnt = 1; searchNC = 0; searchNP = 0
while flag:
for i in range(1, (n + 1)): # 1 ~ n까지
if i == n:
print('{}/{} '.format(i, (n - i + 1)), end='')
else:
print('{}/{}, '.format(i, (n - i + 1)), end='')
nCnt += 1
if (nCnt > inputN):
searchNC = i
searchNP = n - i + 1
flag = False
break
print()
n += 1
print('{}항: {}/{}'.format(inputN, searchNC, searchNP))
Python
복사
순열 : nPr
순서를 지켜서 일렬로 나열하는 경우의 수
# 파이썬을 이용해서 순열을 구하는 프로그램
n = int(input('N 입력: '))
r = int(input('R 입력: '))
result = 1 #결과값 초기화
# nPr = n * (n-1) * ... * (n-r+1)
for i in range(n, (n-r), -1):
result *= i
print('{}P{} 의 값 : {}'.format(n, r, result))
Python
복사
원순열
시작과 끝의 구분이 없는 순열
# n명의 사람이 원탁 테이블에 앉는 경우의 수를 구하자
# 1. math 모듈 활용
import math
n = int(input('친구 수 입력: '))
result = 1
print('{}명의 사람이 원탁에 앉는 경우의 수: {}'.format(n,math.factorial(n-1)))
# 2.
n = int(input('친구 수 입력: '))
result = 1
for i in range(n-1, 0, -1): # 또는 range(1,n)
result *= i
print('{}명의 사람이 원탁에 앉는 경우의 수: {}'.format(n,result))
Python
복사
조합
순서 상관없이 r개를 뽑는 경우
# 조합을 계산하는 프로그램을 만들자.
# 1. math
n = int(input('N 입력: '))
r = int(input('R 입력: '))
import math
result = 1
# nCr = n * ... * (n - r + 1) / r! -> (n - r)! / r!
result = (math.factorial(n) / math.factorial(n-r)) / math.factorial(r)
print('{}C{} 의 값: {}'.format(n,r,int(result)))
Python
복사
확률
모든 사건에서 특정 사건이 일어나는 경우의 수
조합을 이용해서 확률을 알아낼 수 있다.
import math
# 꽝이 4개, 선물이 3개 중에서 꽝 2개, 선물 1개를 뽑는 확률을 구하자.
while True:
n = int(input('전체 카드 수 입력: '))
r = int(input('뽑을 카드 수 입력: '))
tot_case = math.factorial(n) / math.factorial(n-r) / math.factorial(r)
print('sample: {}'.format(int(tot_case)))
fail_n = int(input('fail card count 입력: '))
fail_r = int(input('fail get count 입력: '))
fail_case = math.factorial(fail_n) / math.factorial(fail_n - fail_r) / math.factorial(fail_r)
print('event1: {}'.format(int(fail_case)))
wow_n = int(input('wow card count 입력: '))
wow_r = int(input('wow get count 입력: '))
wow_case = math.factorial(wow_n) / math.factorial(wow_n - wow_r) / math.factorial(wow_r)
print('event2: {}'.format(int(wow_case)))
break
result = (fail_case * wow_case / tot_case) * 100
print('probability: {}%'.format(round(result,2)))
Python
복사