03-02 기초 수학 문제풀이
31_약수와 소수
import random
rNum = random.randint(100, 1000)
print(f'rNum: {rNum}')
for num in range(1, rNum+1):
soinsuFlag = 0
if rNum % num == 0:
print(f'[약수]: {num}')
soinsuFlag += 1
if num != 1:
flag = True
for n in range(2, num):
if num % n == 0:
flag = False
break
if flag:
print(f'[소수]: {num}')
soinsuFlag += 1
if soinsuFlag >= 2:
print(f'[소인수]:{num}')
32_소인수와 소인수분해
import random
rNum = random.randint(100, 1000)
print(f'rNum: {rNum}')
soinList = []
n = 2
while n <= rNum:
if rNum % n == 0:
print(f'소인수: {n}')
soinList.append(n)
rNum /= n
else:
n += 1
print(f'soinList: {soinList}')
tempNum = 0
for s in soinList:
if tempNum != s:
print(f'{s}\'s count: {soinList.count(s)}')
tempNum = s

33_최대공약수
import random
rNum1 = random.randint(100, 1000)
rNum2 = random.randint(100, 1000)
print(f'rNum1: {rNum1}')
print(f'rNum2: {rNum2}')
maxNum = 0
for n in range(1, min(rNum1, rNum2)+1):
if rNum1 % n == 0 and rNum2 % n == 0:
print(f'공약수: {n}')
maxNum = n
print(f'최대공약수: {maxNum}')
if maxNum == 1:
print(f'{rNum1}과 {rNum2}는 서로소인다.')

34_최소공배수
import random
rNum1 = random.randint(100, 1000)
rNum2 = random.randint(100, 1000)
print(f'rNum1: {rNum1}')
print(f'rNum2: {rNum2}')
maxNum = 0
for n in range(1, min(rNum1, rNum2)+1):
if rNum1 % n == 0 and rNum2 % n == 0:
print(f'공약수: {n}')
maxNum = n
print(f'최대공약수: {maxNum}')
minNum = (rNum1 * rNum2) // maxNum
print(f'최소공배수: {minNum}')

35_진법
'''
10진수 --> 2, 8, 16진수 변환
x진수 --> 10진수
X진수 --> x진수
'''
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진수(0o135) -> 2진수({})'.format(bin(0o135)))
print('8진수(0o135) -> 10진수({})'.format(int(0o135)))
print('8진수(0o135) -> 16진수({})'.format(hex(0o135)))
print('16진수(0x5f) -> 2진수({})'.format(bin(0x5f)))
print('16진수(0x5f) -> 8진수({})'.format(oct(0x5f)))
print('16진수(0x5f) -> 10진수({})'.format(int(0x5f)))

36_등차수열
'''
{4, 10, 16, 22, 28,...}
등차수열의 일반항: an = a1 + (n-1) * d
등차수열의 합: sn = n(a1 + an) / 2
'''
inputA1 = int(input('a1 입력: '))
inputD = int(input('공차 입력: '))
inputN = int(input('n 입력: '))
valueN = 0
sumN = 0
n = 1
while n <= inputN:
if n == 1 :
valueN = inputA1
sumN += valueN
print('{}번재 항의 값: {}'.format(n, valueN))
print('{}번재 항까지의 합: {}'.format(n, sumN))
n += 1
continue
valueN += inputD
sumN += valueN
print('{}번재 항의 값: {}'.format(n, valueN))
print('{}번재 항까지의 합: {}'.format(n, sumN))
n += 1
print('{}번재 항의 값: {}'.format(inputN, valueN))
print('{}번재 항까지의 합: {}'.format(inputN, sumN))

'''
{4, 10, 16, 22, 28,...}
등차수열의 일반항: an = a1 + (n-1) * d
등차수열의 합: sn = n(a1 + an) / 2
'''
inputA1 = int(input('a1 입력: '))
inputD = int(input('공차 입력: '))
inputN = int(input('n 입력: '))
valueN = inputA1 + (inputN - 1) * inputD
print('{}번재 항의 값: {}'.format(inputN, valueN))
sumN = inputN * (inputA1+valueN) / 2
print('{}번재 항까지의 합: {}'.format(inputN, int(sumN)))

37_등비수열
'''
{2, 6, 18, 54, 162,...}
등비수열의 일반항: an = a1 * r^(n-1)
등비수열의 합: sn = a1 * (1-r^n) / (1-r)
'''
inputA1 = int(input('a1 입력: '))
inputR = int(input('공비 입력: '))
inputN = int(input('n 입력: '))
valueN = 0
sumN = 0
n = 1
while n <= inputN:
if n == 1:
valueN = inputA1
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))

'''
{2, 6, 18, 54, 162,...}
등비수열의 일반항: an = a1 * r^(n-1)
등비수열의 합: sn = a1 * (1-r^n) / (1-r)
'''
inputA1 = int(input('a1 입력: '))
inputR = int(input('공비 입력: '))
inputN = int(input('n 입력: '))
valueN = inputA1 * (inputR ** (inputN-1))
print('{}번째 항의 값: {}'.format(inputN, valueN))
sumN = inputA1 * (1-(inputR ** inputN)) / (1-inputR)
print('{}번째 항까지의 합: {}'.format(inputN, int(sumN)))

38_시그마
'''
{2, 4, 8, 16, 32, 64,...}
'''
inputA1 = int(input('a1 입력:'))
inputR = int(input('공비 입력:'))
inputN = int(input('n 입력:'))
valueN = 0; sumN = 0
n = 1
while n <= inputN:
if n == 1:
valueN = inputA1
sumN = valueN
print('{}번째 항까지의 합: {}'.format(n, sumN))
n += 1
continue
valueN *= inputR
sumN += valueN
print('{}번째 항까지의 합: {}'.format(n, sumN))
n += 1
print('{}번째 항까지의 합: {}'.format(inputN, format(sumN, ',')))

inputA1 = int(input('a1 입력:'))
inputR = int(input('공비 입력:'))
inputN = int(input('n 입력:'))
sumN = inputA1 * (1 - (inputR ** inputN)) / (1 - inputR)
print('{}번째 항까지의 합: {}'.format(inputN, format(sumN, ',')))

39_계차수열
'''
{2, 5, 11, 20, 32, 47, 65, 86, 110, 137, 167...}
an = {2, 5, 11, 20, 32, 47, 65, 86, 110, 137, 167...}
bk = 3, 6, 9, 12,...
k=1 부터 n-1까지의 시그마 bk = an-a1
'''
inputA1 = int(input('a1 입력:'))
inputN = int(input('an 입력:'))
valueN = ((3 * inputN ** 2) - (3 * inputN) + 4) / 2
print('an의 {}번째 항의 값: {}'.format(inputN, int(valueN)))

40_피보나치수열
'''
{1, 1, 2, 3, 5, 8, 13, 21, 34,...}
'''
inputN = int(input('n입력:'))
valueN = 0; sumN = 0
valuePreN2 = 0
valuePreN1 = 0
n = 1
while n <= inputN:
if n == 1 or n == 2:
valueN = 1
valuePreN2 = valueN
valuePreN1 = valueN
sumN += valueN
n += 1
else:
valueN = valuePreN2 + valuePreN1
valuePreN2 = valuePreN1
valuePreN1 = valueN
sumN += valueN
n += 1
print('{}번째 항의 값: {}'.format(inputN, valueN))
print('{}번째 항까지의 합: {}'.format(inputN, sumN))

41_군 수열

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)))

42_순열

'''
- 9P4
- 6P2
'''
numN = int(input('numN 입력:'))
numR = int(input('numR 입력:'))
result = 1
for n in range(numN, (numN - numR), -1):
print('n: {}'.format(n))
result = result * n
print('result: {}'.format(result))

'''
[1], [2], [3], [4], [5], [6], [7]
'''
fNum1 = int(input('factorial1:'))
result1 = 1
for n in range(fNum1, 0, -1):
result1 *= n
print('result1: {}'.format(result1))
fNum2 = int(input('factorial2:'))
result2 = 1
for n in range(fNum2, 0, -1):
result2 *= n
print('result1: {}'.format(result2))
print('모든 경우의 수: {}'.format(result1 * result2))

43_조합
'''
- 9C4
- 6C2
'''
numN = int(input('numN 입력:'))
numR = int(input('numR 입력:'))
resultP = 1
resultR = 1
resultC = 1
for n in range(numN, (numN-numR), -1):
resultP = resultP * n
print('resultP: {}'.format(resultP))
for n in range(numR, 0, -1):
resultR = resultR * n
print('resultR: {}'.format(resultR))
resultC = int(resultP / resultR)
print('resultC: {}'.format(resultC))

'''
[1], [2], [3], [4], [5], [6], [7]
'''
numN = int(input('numN 입력:'))
numR = int(input('numR 입력:'))
resultP = 1
resultR = 1
resultC = 1
for n in range(numN, (numN-numR), -1):
resultP = resultP * n
print('resultP: {}'.format(resultP))
for n in range(numR, 0, -1):
resultR = resultR * n
print('resultR: {}'.format(resultR))
resultC = int(resultP / resultR)
print('resultC: {}'.format(resultC))
result = (1/resultC) * 100
print('{}%'.format(round(result, 2)))

- 참고로, 순열과 조합을 계산해 주는 Math라는 Python 함수들이 있다
44_확률

'''
꽝 | 꽝 | 선물 | 꽝 | 선물
선물 | 꽝 | 꽝 | 선물 | 꽝
'''
def proFun():
numN = int(input('numN 입력:'))
numR = int(input('numR 입력:'))
resultP = 1
resultR = 1
resultC = 1
for n in range(numN, (numN-numR), -1):
resultP = resultP * n
print('resultP: {}'.format(resultP))
for n in range(numR, 0, -1):
resultR = resultR * n
print('resultR: {}'.format(resultR))
resultC = int(resultP / resultR)
print('resultC: {}'.format(resultC))
return resultC
sample = proFun()
print('sample: {}'.format(sample))
event1 = proFun()
print('sample: {}'.format(event1))
event2 = proFun()
print('sample: {}'.format(event2))
probability = (event1 * event2) / sample
print('probability: {}%'.format(round(probability * 100, 2)))
