Study_note(zb_data)/Python
스터디 노트 (기초 수학 문제풀이 31 ~ 45)_0718
KloudHyun
2023. 7. 20. 12:08
(기초 수학 문제풀이)
📌 [연습문제] 약수
- 100부터 1000사이의 난수에 대해서 약수, 소수, 그리고 소인수를 출력하는 프로그램을 만들어보자
#100부터 1000사이의 난수에 대해서 약수, 소수, 그리고 소인수를 출력하는 프로그램을 만들어보자
import random
rNum = random.randint(100, 1000) #랜덤 난수 발생
print(f'rNum : {rNum}')
for num in range(1, rNum+1):
soinsuFlag = 0
#약수
if rNum % num == 0: #랜덤 난수가 num으로 나누어 떨어질 때, 약수가 되고 반복 실행
print(f'rNum의 약수 : {num}')
soinsuFlag += 1 #소인수 플래그에 1을 추가한다.
#소수
if num != 1: #소수는 1을 제외하기 때문에, 2부터 시작
flag = True
for n in range(2, num):
if num % n == 0: #
flag = False
break
if(flag):
print(f'rNum의 소수 : {num}')
soinsuFlag += 1 #소인수 플래그에 1을 추가한다.
#소인수
if soinsuFlag >= 2: #소수와 약수 둘다 만족하면 소인수이다.
print(f'[소인수] : {num}')
- 100부터 1000사이의 난수를 소인수분해하고 소인수에 대한 지수를 출력하는 프로그램을 만들어보자
import random
rNum = random.randint(100, 1000)
print(f'rNum:{rNum}')
List = []
n = 2
while n <= rNum:
if rNum % n == 0: #랜덤 난수가 n과 나누어 떨어질 때
print(f'소인수 : {n}') #소인수를 출력하고
List.append(n) #소인수를 리스트에 넣는다
rNum /= n #그리고 n으로 계속 나누기 시도 (안된다면 else문으로)
else:
n+=1 #안되면 n에 +1 을 해서 다음 숫자로 나눠본다 (반복)
print(f'List = {List}')
tempNum = 0
for s in List:
if tempNum != s: #tempNum이 s와 같지 않을 때,
print(f'{s}\'s count : {List.count(s)}') #List에 있는 숫자 들의 개수를 센다
tempNum = s
📌 [연습문제] 최대공약수
- 100부터 1000사이의 난수에 대해서 최대공약수를 구하는 프로그램을 만들어보자
import random
rNum1 = random.randint(100, 1000)
rNum2 = random.randint(100, 1000)
maxNum = 0
numList = []
for n in range(1, (min(rNum1, rNum2)+1)):
#난수 두개중 어떤게 제일 작은 숫자일지 모르니 min 함수를 이용, 최소값으로 반환
if rNum1 % n == 0 and rNum2 % n == 0: #두 숫자가 n으로 나누어 떨어질 때
numList.append(n) #n을 list에 넣는다.
print(f'{rNum1}, {rNum2} numList : {numList}')
maxNum = numList.pop() #list에 있던 숫자 중 제일 높은 숫자를 뽑는다.
print(f'{rNum1}, {rNum2} maxNum : {maxNum}')
if maxNum == 1: #list에 숫자 1만 있으면, 공약수가 1밖에 없기 때문에, 서로소이다.
print(f'{rNum1}과 {rNum2}는 서로소이다.')
📌 [연습문제] 최소공배수
- 100부터 1000사이의 난수에 대해서 최대공약수를 구하는 프로그램을 만들어보자
#100부터 1000사이의 난수에 대해서 최소공배수를 구하는 프로그램을 만들어보자
import random
rNum1 = random.randint(100, 1000)
rNum2 = random.randint(100, 1000)
maxNum = 0
numList = []
for n in range(1, (min(rNum1, rNum2)+1)):
if rNum1 != rNum2:
if rNum1 % n == 0 and rNum2 % n == 0: #공약수를 구한다.
numList.append(n) #list에 공약수를 넣고
maxNum = n #maxNum에 n을 할당한다 (숫자가 계속 높아지기 때문에 자동으로 최대 공약수가 구해짐)
print(f'{rNum1}, {rNum2} List = {numList}') #공약수 리스트
print(f'{rNum1}, {rNum2} MaxNum = {maxNum}') #최대 공약수
minNum = rNum1 * rNum2 // maxNum #최소 공배수는 두 수를 곱하고 이를 최대 공약수로 나누면 구해진다.
print(f'{rNum1}, {rNum2} MinNum = {minNum}') #최소 공배수
📌 [연습문제] 진법 변환
- 100부터 1000사이의 난수에 대해서 최대공약수를 구하는 프로그램을 만들어보자
#진법 변환
dNum = int(input('10진수 입력 : '))
print('2진수 : {}'.format(bin(dNum)))
print('8진수 : {}'.format(oct(dNum)))
print('16진수 : {}'.format(hex(dNum)))
print('2진수(0b10101) -> 10진수 ({})'.format(int('0b10101', 2)))
print('8진수(0o135) -> 10진수 ({})'.format(int('0o135', 8)))
print('16진수(0x5f) -> 10진수 ({})'.format(int('0x5f', 16)))
print('2진수(0b10101) -> 8진수 ({})'.format(oct(0b10101)))
print('2진수(0b10101) -> 10진수 ({})'.format(int(0b10101)))
print('2진수(0b10101) -> 16진수 ({})'.format(hex(0b10101)))
print('8진수(0o57) -> 2진수 ({})'.format(bin(0o57)))
print('8진수(0o57) -> 10진수 ({})'.format(int(0o57)))
print('8진수(0o57) -> 16진수 ({})'.format(hex(0o571)))
print('16진수(0x8f) -> 2진수 ({})'.format(bin(0x8f)))
print('16진수(0x8f) -> 8진수 ({})'.format(oct(0x8f)))
print('16진수(0x8f) -> 10진수 ({})'.format(int(0x8f)))
📌 [연습문제] 등차수열
- 등차수열의 일반항, 합 등을 구하는 프로그램을 만들어보자
input_a1 = int(input('ai 입력 : '))
input_d = int(input('공차 d 입력 : '))
input_an = int(input('n번째 항 입력 : '))
value_N = 0 #n항의 값
sum_N = 0 #n항까지의 합
n = 1
while n<=input_an:
if n == 1:
value_N = input_a1 #첫번째 항의 값은 a1과 같다
sum_N = value_N #동일
print('{}번째 항의 값 : {}'.format(n, value_N))
print('{}번째 항까지의 합 : {}'.format(n, sum_N))
n+=1 #무한루프에 빠지지 않게끔 조건을 걸어줌
continue
else:
value_N += input_d #공차를 계속 더해준다 (등차수열)
sum_N += value_N #공차를 더해준 밸류값을 합에 계속 더해줌 (등차수열의 합)
print('{}번째 항의 값 : {}'.format(n, value_N))
print('{}번째 항까지의 합 : {}'.format(n, sum_N))
n+=1 #무한루프에 빠지지 않게끔 조건을 걸어줌
print()
print('{}번째 항의 값 : {}'.format(input_an, value_N))
print('{}번째 항까지의 합 : {}'.format(input_an, sum_N))
#an = a1 + (n-1) *d #등차 수열의 일반항
value_N = input_a1 + (input_an -1) *input_d
print('{}번째 항의 값 : {}'.format(input_an, value_N))
#sn = n(a1+an) /2 #등차 수열의 합
sum_N = input_an*(input_a1 + value_N) / 2
print('{}번째 항까지의 합 : {}'.format(input_an, int(sum_N)))
📌 [연습문제] 등비수열
- 등비수열의 일반항, 합 등을 구하는 프로그램을 만들어보자
#등비수열의 일반항, 합 등을 구하는 프로그램을 만들어보자
input_a1 = int(input('ai 입력 : '))
input_r = int(input('공비 r 입력 : '))
input_an = int(input('n번째 항 입력 : '))
valueN = 0
sumN = 0
n = 1
while n<=input_an:
if n == 1:
valueN = input_a1 #1번째 항 = a1
sumN = valueN #1번째 항까지의 합 = 1번째 항
print('{}번째 항의 값 : {}'.format(n, valueN))
print('{}번째 항까지의 합 : {}'.format(n, sumN))
n+=1 #무한루프에 빠지지 않도록 n을 걸어준다
continue
else:
valueN *= input_r #밸류에 공비를 계속 곱해준다.
sumN += valueN #등비수열의 합에 밸류를 계속 더해준다
print('{}번째 항의 값 : {}'.format(n, valueN))
print('{}번째 항까지의 합 : {}'.format(n, sumN))
n+=1
print()
print('{}번째 항의 값 : {}'.format(input_an, valueN))
print('{}번째 항까지의 합 : {}'.format(input_an, sumN))
an = a1 * r^(n-1) #등비수열의 일반항
sn = a1 * (1-r^n) / 1-r #등비수열의 합
valueN2 = input_a1 * input_r ** (input_an - 1)
sumN2 = input_a1 * (1 - (input_r ** input_an)) / (1-input_r)
print('{}번째 항의 값 : {}'.format(input_an, valueN2))
print('{}번째 항까지의 합 : {}'.format(input_an, int(sumN2)))
📌 [연습문제] 계차수열
#다음 수열의 일반항을 구하고, n항의 값을 출력하는 프로그램을 만들어보자 (계차수열)
#시그마 k = 1 -> n-1까지의 합 = an - a1 이걸로 an을 구한다.
#구한 an 으로 항의 값을 출력한다.
#an 2, 5, 11, 20, 32, 47, 65, 86, 110, 137, 167...
#bn 3, 6, 9, 12, 15, 18 ....
an = (3n^2 - 3n + 4) / 2
input_a1 = int(input('ai 입력 : '))
input_an = int(input('n번째 항 입력 : '))
valueN = (3 * input_an ** 2 - 3*(input_an) + 4 ) / 2
print('{}번째 항의 값 : {}'.format(input_an, int(valueN)))
📌 [연습문제] 피보나치 수열
#1, 1, 2, 3, 5, 8, 13, 21, 34 ...
input_an = int(input('n번째 항 입력 : '))
valueN = 0; sumN = 0
valuePreN2 = 0 #valueN에서 2번째 전의 항
valuePreN1 = 0 #valueN에서 1번째 전의 항
n=1
while n<=input_an:
if n == 1 or n == 2:
valueN = 1 #1, 2번째 항은 1이다
valuePreN2 = valuePreN1 #N2 항은 N1항이 되고
valuePreN1 = valueN #N1항은 valueN이 된다
sumN += valueN #valueN은 sum에 계속 더해진다.
n+=1
else:
valueN = valuePreN1 + valuePreN2 #N1 항과 N2항을 더하면 valueN이 된다 (1+1 = 2)
valuePreN2 = valuePreN1
valuePreN1 = valueN
sumN += valueN
n+=1
print('{}번째 항 : {}'.format(input_an, valueN))
print('{}번째 항까지의 합 : {}'.format(input_an, sumN))
📌 [연습문제] 팩토리얼 구하기
def facFun(n):
fac = 1
for n in range(1, n + 1): #실질적으로는 1~n까지
fac = fac * n #1~n까지 계속 곱한다 (팩토리얼의 정의)
return fac
num = int(input('input number : '))
print(f'{num}! : {facFun(num)}')
def facFun2(n): #재귀함수
if n == 1:
return n
return n * facFun2(n-1)
print(f'{num}! : {facFun2(num)}')
import math #math 모듈을 활용.
num = int(input('input number : '))
print(f'{num}! : {math.factorial(num)}')
📌 [연습문제] 계차수열 2
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 += i / (n-i+1)
nCnt += 1
if sumN > 100:
searchNC = i; searchNP = n - i + 1
flag = False
break
print()
n += 1
print('수열의 합이 최초로 100을 초과하는 항, 값, 합 : {}항, {}/{}, {} '.format(nCnt, searchNC, searchNP, round(sumN, 2)))
>>
1/1
1/2 2/1
1/3 2/2 3/1
1/4 2/3 3/2 4/1
1/5 2/4 3/3 4/2 5/1
1/6 2/5 3/4 4/3 5/2 6/1
1/7 2/6 3/5 4/4 5/3 6/2 7/1
1/8 2/7 3/6 4/5 5/4 6/3 7/2 8/1
1/9 2/8 3/7 4/6 5/5 6/4 7/3 8/2 9/1
1/10 2/9 3/8 4/7 5/6 6/5 7/4 8/3 9/2 10/1
수열의 합이 최초로 100을 초과하는 항, 값, 합 : 56항, 10/1, 105.81
📌 [연습문제] nPr 순열 구하기
#9P4 = n(n-1)....(n-r+1)! - 9P4 > 9*8*7*6
numN = int(input('numN 입력 : '))
numR = int(input('numR 입력 : '))
resultP = 1
resultR = 1
for n in range(numN, numN - numR, -1): # 9P4 구하기
print('n = {}'.format(n))
resultP *= n
print('result = {}'.format(resultP))
for n in range(numR, 0, -1): # r! 구하기
print('n = {}'.format(n))
resultR *= n
print('result = {}'.format(resultR))
#9C4
resultC = int(resultP/resultR) #nCr = nPr / r!
print('nCr = {}'.format(resultC))
📌 [연습문제] nPr 순열 구하기
numN = int(input('numN 입력 : '))
numR = int(input('numR 입력 : '))
resultR=1
resultP=1
resultC=1
for i in range(numN, numN-numR, -1): #nPr 구하기
resultP *= i
print('resultP = {}'.format(resultP))
for j in range(numR, 0, -1): #r! 구하기
resultR *= j
print('resultR = {}'.format(resultR))
resultC = int(resultP/resultR) #nCr 구하기
print('resultC = {}'.format(resultC))
result = (1/resultC) * 100 #확률 구하기
print('result = {}%'.format(round(result, 2)))
📌 [연습문제] 확률 구하기
- 6C3 * 4C3 / 10C6 구하기
def Function():
numN = int(input('numN 입력 : '))
numR = int(input('numR 입력 : '))
resultP = 1
resultR = 1
resultC = 1
for i in range(numN, numN - numR, -1):
resultP *= i
print('resultP = {}'.format(resultP))
for j in range(numR, 0, -1):
resultR *= j
print('resultR = {}'.format(resultR))
resultC = int(resultP / resultR)
print('resultC = {}'.format(resultC))
return resultC
sample = Function()
print('sample : {}'.format(sample))
event1 = Function()
print('event1 : {}'.format(event1))
event2 = Function()
print('event2 : {}'.format(event2))
result = (event1 * event2) / sample
print('최종 확률 : {}%'.format(round(result*100, 2)))
>>
numN 입력 : 10
numR 입력 : 6
resultP = 151200
resultR = 720
resultC = 210
sample : 210
numN 입력 : 6
numR 입력 : 3
resultP = 120
resultR = 6
resultC = 20
event1 : 20
numN 입력 : 4
numR 입력 : 3
resultP = 24
resultR = 6
resultC = 4
event2 : 4
최종 확률 : 38.1%