약수 & 소수 & 소인수
# 100 ~ 1000사이의 난수에 대해서 약수, 소수, 소인수를 출력하자.
import random
n = random.randint(100,1000)
print(f'선택된 100 ~ 1000 사이의 숫자: {n}')
# 1. 약수
num_list = []
for i in range(1,n+1):
if n % i == 0:
num_list.append(i)
# 2. 소수
prime_list = []
for i in range(2,n+1): # 1은 소수가 아니기 때문에 일단 제외
flag = True
for num in range(2,i): # 2 ~ (자기자신 - 1)까지의 범주에서 나눠떨어지는 값이 있다면 소수가 아니다.
if i % num == 0:
flag = False
break
if flag:
prime_list.append(i)
# 3. 소인수
# 2로 나누는 것부터 시작한다. -> 1은 소수가 아니기 때문에 제외
prime_only_list = []
a = 2
while a <= n:
if n % a == 0: # 해당 값으로 나눠떨어질 때
prime_only_list.append(a)
n /= a
else:
a += 1
print(f'약수 출력: {num_list}')
print(f'소수 출력: {prime_list}')
print(f'소인수 출력: {prime_only_list}')
Python
복사
# 하나의 for 문안에서 해결해보기
import random
n = random.randint(100,1000)
print(f'선택된 100 ~ 1000 사이의 숫자: {n}')
num_list = []
prime_list = []
prime_only_list = []
for i in range(1,n+1):
soinsuF = 0 # 소인수인지 확인할 변수 초기화
# 약수
if n % i == 0:
num_list.append(i)
soinsuF += 1
# 소수
if i != 1:
flag = True
for num in range(2,i):
if i % num == 0:
flag = False
break
if(flag):
prime_list.append(i)
soinsuF += 1
# 소인수
if soinsuF >= 2: # 약수이고 소수라면
prime_only_list.append(i)
print(f'약수 출력: {num_list}')
print(f'소수 출력: {prime_list}')
print(f'소인수 출력: {prime_only_list}')
Python
복사
# 100부터 1000사이의 난수를 소인수분해하고 각각의 소인수에 대한 지수를 출력하자.
import random
num = random.randint(100,1000)
# 소인수분해 하기
n = 2
print(f'100 ~ 1000 사이의 선택된 숫자 : {num}')
prime_number = []
while n <= num:
if num % n == 0:
prime_number.append(n)
num /= n
else:
n += 1
print(f'소인수분해: {prime_number}')
tempNum = 0
for s in prime_number:
if tempNum != s:
print(f'소인수 {s}의 개수: {prime_number.count(s)}')
tempNum = s
else:
continue
Python
복사
특정 원소에 대해 list.count(특정원소)로 개수를 카운트해준 뒤, tempNum = 특정원소 를 해주면 if tempNum ≠ s 라는 조건에 따라 중복된 특정 원소가 나온다면 카운트를 해주지 않게 된다.
최대공약수
# 100 ~ 1000 사이의 두 개의 난수에 대해 공약수와 최대공약수를 출력하고, 서로소인지 출력하자.
import random
n1 = random.randint(100,1000)
n2 = random.randint(100,1000)
# 공약수 확인
c_f = [] # common factor
gc_d = 0 # greatest common divisor
for i in range(1,min(n1,n2)+1):
if n1 % i == 0 and n2 % i == 0: # 공약수인 조건
c_f.append(i)
# 최대공약수 세팅
gc_d = i
print(f'{n1}와 {n2}의 공약수 : {c_f}')
print(f'{n1}와 {n2}의 최대공약수 : {gc_d}')
# 최대공약수가 1이라면 서로소
if gc_d == 1:
print(f'{n1}과 {n2}는 서로소')
Python
복사
최소공배수
# 100부터 1000사이의 두 개의 난수에 대해 최대공약수와 최소공배수를 출력하자.
import random
n1 = random.randint(100,1000)
n2 = random.randint(100,1000)
# 1. 최대공약수
gc_d = 0
for i in range(1,min(n1,n2)+1):
if n1 % i == 0 and n2 % i == 0:
gc_d = i
# 마지막 변경된 gc_d 값이 최대공약수
# 최소공배수 = (n1 * n2) // gc_d
lc_m = (n1 * n2) // gc_d
print(f'{n1}과 {n2}의 최대공약수 : {gc_d}')
print(f'{n1}과 {n2}의 최소공배수 : {lc_m}')
Python
복사
진법
# 사용자가 입력한 10진수를 2,8,16진수로 변환하자.
Num = int(input('1보다 큰 정수 입력: '))
# 10진수 -> X진수 변환
print(f'{Num}의 2진수 변환: {bin(Num)}')
print(f'{Num}의 8진수 변환: {oct(Num)}')
print(f'{Num}의 16진수 변환: {hex(Num)}')
bi_Num = bin(Num)
oct_Num = oct(Num)
hex_Num = hex(Num)
# X진수 -> 10진수 변환 (int사용)
print(f'{bi_Num}의 10진수 변환: {int(bi_Num,2)}')
print(f'{oct_Num}의 10진수 변환: {int(oct_Num,8)}')
print(f'{hex_Num}의 10진수 변환: {int(hex_Num,16)}')
# X진수 -> X진수 변환 : 똑같이 bin(), oct(), hex(), int() 함수 사용하면 됨.
Python
복사
등차수열
# 수열의 일반항을 구하고 n번째항의 값과 합을 구하자.
a1 = int(input('첫째항 입력: '))
d = int(input('공차 입력: '))
n = int(input('구할 n번째 항의 n입력: '))
# n번째 항의 값
valueN = a1 + (n-1) * d
print(f'n번째 항의 값: {valueN}')
# n번째까지의 합
sumN = (a1 + valueN) * n / 2
print(f'n번째 항까지의 합: {int(sumN)}')
Python
복사
또는 전체 수열의 변화양상을 보고 싶다면
# 수열의 일반항을 구하고 n번째항의 값과 합을 구하자.
a1 = int(input('첫째항 입력: '))
d = int(input('공차 입력: '))
inputN = int(input('구할 n번째 항의 n입력: '))
valueN = 0; sumN = 0;
n = 1
while n <= inputN: # 첫째항 ~ 끝항까지
if n == 1:
valueN = a1
sumN += valueN
print('{}번째 항의 값: {}'.format(n,valueN))
print('{}번째 항까지의 합: {}'.format(n,sumN))
n += 1
continue
valueN += d
sumN += valueN
print('{}번째 항의 값: {}'.format(n,valueN))
print('{}번째 항까지의 합: {}'.format(n,sumN))
n += 1
print('{}번째 항의 값: {}'.format(inputN,valueN))
print('{}번째 항까지의 합: {}'.format(inputN,sumN))
Python
복사
등비수열
•
과정 보기 
# 등비수열의 일반항을 구하고 n번째 항의 값과 합을 구하자.
a1 = int(input('첫째항 입력: '))
inputR = int(input('공비 입력: '))
inputN = int(input('n 입력: '))
valueN = 0; sumN = 0;
n = 1
while n <= inputN:
if n == 1: # 첫째항 포맷
valueN = a1
sumN += valueN
print('{}번째 항의 값: {}'.format(n,valueN))
print('{}번째 항까지의 합: {}'.format(n,sumN))
n += 1
continue
valueN *= inputR
sumN += valueN
print('{}번째 항의 값: {}'.format(n, valueN))
print('{}번째 항까지의 합: {}'.format(n, sumN))
n += 1
print('{}번째 항의 값: {}'.format(inputN, valueN))
print('{}번째 항까지의 합: {}'.format(inputN, sumN))
Python
복사
# 등비수열의 일반항을 구하고 n번째 항의 값과 합을 구하자.
a1 = int(input('첫째항 입력: '))
inputR = int(input('공비 입력: '))
inputN = int(input('n 입력: '))
valueN = a1 * inputR ** (inputN - 1)
print('{}번째 항의 값: {}'.format(inputN, valueN))
sumN = a1 * (1 - (inputR ** inputN)) / (1 - inputR)
print('{}번째 항까지의 합: {}'.format(inputN, int(sumN)))
Python
복사
시그마
# 첫째항이 2, 공비는 2일때, 30번째 항의 값과 합을 구해보자.
a1 = int(input('첫째항 입력: '))
inputR = int(input('공비 입력: '))
inputN = int(input('n 입력: '))
valueN = a1 * inputR ** (inputN - 1)
print('{}번째 날에 받게 되는 쌀의 양: {}'.format(inputN,valueN))
sumN = a1 * (1 - (inputR ** inputN)) / (1 - inputR)
print('{}번째 날까지 받게 되는 쌀의 양: {}'.format(inputN,int(sumN)))
Python
복사
# 만약 시그마를 이용해서 전체 sumN을 구한다고 하면
sumN = a1 * ((inputR ** inputN) - 1) / (inputR - 1)
print('{}번째 날까지 받게 되는 쌀의 양: {}'.format(inputN,int(sumN)))
Python
복사
계차수열
# 계차수열의 일반항을 구하고, n항의 값을 출력하자
a1 = int(input('an의 첫째항 입력: '))
b1 = int(input('bn의 첫째항 입력: '))
bd = int(input('bn의 공차 입력: '))
inputN = int(input('구할 n항의 n입력: '))
# bn
valueBn = b1 + (inputN - 2) * bd
# sumBn
sumBn = (inputN - 1) * (b1 + valueBn) / 2
# an
valueAn = a1 + sumBn
print('계차수열의 {}번째 항의 값: {}'.format(inputN, int(valueAn)))
Python
복사
피보나치수열
# 피보나치수열에서 n항의 값과 n항까지의 합을 구하자.
inputN = int(input('n 입력: '))
valueN = 0; sumN = 0
# 전과 전전값을 저장할 변수 초기화
valuePre = 0
valuePre2 = 0
n = 1
while n <= inputN:
if n == 1 or n == 2:
valueN = 1
valuePre = valueN
valuePre2 = valueN
sumN += valueN
n += 1
else:
valueN = valuePre + valuePre2
valuePre2 = valuePre
valuePre = valueN
sumN += valueN
n += 1
print('{}번째 항의 값: {}'.format(inputN, valueN))
print('{}번째 항까지의 합: {}'.format(inputN, sumN))
Python
복사
팩토리얼
# 팩토리얼
import math
n = int(input('팩토리얼 구할 값 입력: '))
# 1. 반복문
def facFun(n):
result = 1
for i in range(1,n+1):
result *= i
return result
# 2. 재귀함수
def facFun2(n):
if n == 1:
return n
return n * facFun2(n-1)
# 3. 파이썬 모듈
module_result = math.factorial(n)
# 결과 출력
print(f'{n}! 반복문 결과 : {facFun(n)}')
print(f'{n}! 재귀함수 결과 : {facFun2(n)}')
print(f'{n}! 모듈 결과 : {module_result}')
Python
복사
군수열
# 군수열
# 수열의 합이 최초 100을 초과하는 n번째 항의 값과 n을 출력하자.
flag = True
n = 1 # 군을 의미하는 변수
nCnt = 1 # 항을 의미하는 변수
searchNC = 0; searchNP = 0 # 분모와 분자의 값을 의미하는 변수
sumN = 0
while flag:
for i in range(1,(n+1)): # 군의 값만큼 반복
print('{}/{} '.format(i, (n-i+1)), end='') # 분모와 분자 값을 구하기
sumN = sumN + (i / (n-i+1))
nCnt += 1
if sumN > 100:
searchNC = i
searchNP = n-i+1
flag = False
break # for 문을 빠져나오는
print()
n += 1
print('수열의 합이 최초 100을 초과하는 항, 값, 합: {}항, {}/{} , {}'.format(nCnt, searchNC, searchNP, round(sumN,2)))
Python
복사
순열
# 순열을 구하자
numN = int(input('전체 n 입력: '))
numR = int(input('R 입력: '))
# nPr : n * (n-1) *... *(n-r+1)
result = 1
for i in range(numN,(numN - numR),-1):
print('n : {}'.format(i))
result *= i
print('result: {}'.format(result))
Python
복사
# 카드 7장을 일렬로 나열, 2,4,7번 카드가 서로 이웃하도록 나열하는 모든 경우의 수
import math
# 3장의 카드를 나열하는 경우의 수를 분모로 나누기
result = math.factorial(5) * math.factorial(3)
print('result: {}'.format(result))
Python
복사
조합
# 조합
inputN = int(input('전체 수 N 입력: '))
inputR = int(input('뽑는 수 R 입력: '))
import math
# n! / r!(n-r)!
n_Fact = math.factorial(inputN)
r_Fact = math.factorial(inputR)
n_rFact = math.factorial(inputN - inputR)
result = n_Fact / (r_Fact * n_rFact)
print(f'{inputN}C{inputR} : {int(result)}')
Python
복사
# 카드 7장 중 3장을 선택했을 떄, 3,4,5가 동시에 선택될 수 있는 확률?
# 일단 분자는 1
# 분모인 7C3 을 구하자
import math
result = math.factorial(7) / (math.factorial(3) * math.factorial(7-3))
print('확률 : {}%'.format(round((1/result)*100,2)))
Python
복사
확률
# 확률
# 꽝 : 6, 선물 : 4
# 꽝 3, 선물 3개를 뽑는 확률을 구하자.
# 조합으로 구하면 모두 해결된다. 6C3 * 4C3 / 10C6
import math
def johap(n,r):
result = math.factorial(n) / (math.factorial(r) * math.factorial(n-r))
return int(result)
print('확률 : {}%'.format(round((johap(6,3) * johap(4,3)) / johap(10,6)* 100, 2)))
Python
복사