Ch2 기초수학 문제풀이 31-45 (기초문풀1-3)

김민지·2023년 3월 17일
0

Part 02. 수학

목록 보기
3/3
  1. 약수, 소수, 소인수
import random

rNum = random.randint(100, 1000)
print(f'rNum: {rNum}')

yakList = []
soList = []
soinList = []

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}')
  1. 소인수, 소인수분해
  • 소인수분해 하고, 각각 소인수에 대한 지수 출력
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             # 이미 출력된 수에 대해서는 더이상 셀 수 없게 함
        
  • 소인수 지수 구하는 방법 살짝 헷갈!!!
  1. 최대공약수
  • 서로소 : 두 수의 공약수가 1 뿐일 때 두 수를 서로소라고 함
    -> 최대공약수가 1일 때 두 수는 서로소
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}는 서로소이다.')
    
  1. 최소공배수
  • 최소공배수 = 두 수의 곱 / 최대공약수
minNum = int(rNum1 * rNum2 / maxNum)

print(f'최소공배수: {minNum}')
  1. 진법
  • 2진수로 바꾸기: bin(num)
  • 8진수로 바꾸기: oct(num)
  • 16진수로 바꾸기: hex(num)
  • 10진수로 바꾸기: int('num', 2 or 8 or 16) or int(num)
  1. 등차수열
  • 반복문 이용
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
    n += 1
    print('{}번째 항의 값: {}'.format(n, valueN))
    print('{}번째 항까지의 합: {}'.format(n, sumN))
  • 공식 이용
valueN = inputA1 + (inputN - 1) * inputD
sumN = inputN * (inputA1 + valueN) / 2


print('{}번째 항의 값: {}'.format(inputN, valueN))
print('{}번째 항까지의 합: {}'.format(inputN, sumN))
  1. 등비수열
  • 반복문 이용
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))
  • 공식 이용
valueN = inputA1 * (inputR ** (inputN - 1))
sumN = inputA1 * (1 - inputR ** inputN) / (1 - inputR)

print('{}번째 항의 값: {}'.format(inputN, valueN))
print('{}번째 항까지의 합: {}'.format(inputN, sumN))
  1. 시그마
  • 시그마 : 수열의 합을 나타냄
  1. 계차 수열
  • 공식으로 일반항 an을 알아낸 후, 일반항으로 n항값 구하기
  • b(n-1) = an - a(n-1)
    -> 등차수열 b1~b(n-1)의 합은 a1 + an과 같음
inputA1 = int(input('a1 입력: '))
inputN = int(input('an 입력: '))

valueN = (3 * (inputN ** 2) - (3 * inputN) + 4) / 2    #계차 수열의 일반항 이용

print(f'{inputN}번째 항의 값: {int(valueN)}')
  1. 피보나치 수열
  • an = a(n-2) + a(n-1)
inputN = int(input('n 입력: '))

valueN= 0; sumN = 0;

valuePre2 = 0
valuePre1 = 0

n = 1
while n <= inputN:
    if n == 1 or n == 2:               # 첫번째, 두번째 항은 예외로 두기
        valueN = 1
        valuePre2 = valueN
        valuePre1 = valueN
        sumN += valueN
        n += 1

    else:
        valueN = valuePre2 + valuePre1     # 피보나치 수열 공식
        valuePre2 = valuePre1
        valuePre1 = valueN
        sumN += valueN
        n += 1

print('{}항의 값: {}'.format(inputN, valueN))
print('{}항까지의 합: {}'.format(inputN, sumN))
  1. 팩토리얼
  • 반복문을 이용한 함수 만들어 사용
def facFun1(n):

    fac = 1
    for n in range(1, (n+1)):
        fac *= n

    return fac

num = int(input('input number: '))
print(f'{num}!: {facFun1(num)}')
  • 재귀함수 이용한 함수 만들어 사용
def facFun2(n):
    if n == 1:
        return n         # 재귀함수 돌다가 n이 1이 되자마자 return으로 끝내버림
    return n * facFun2(n-1)

num = int(input('input number: '))
print(f'{num}!: {facFun2(num)}')
  • math모듈의 factorial()함수 이용
import math
num = int(input('input number: '))
valueN = math.factorial(num)
print(f'{num}!: {valueN}')
  1. 군 수열
  • 문제: 수열의 합이 최초 100을 초과하는 n번째항 구하기
  • 수열 -> 각 군에서 분자는 1씩 늘어나고 분모는 1씩 줄어듬. 군의 수는 1씩 늘어남.
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, sumN))
  1. 순열
  • nPr 순열 경우의수 구하기
numN = int(input('numN 입력: '))
numR = int(input('numR 입력: '))
result = 1

for n in range(numN, numN-numR, -1):
    print('n : {}'.format(n))
    result *= n

print(f'{numN}P{numR} : {result}')
  • 카드 7장을 나열할 때, 3장의 카드가 이웃하는 경우의 수 구하기
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('result2: {}'.format(result2))

result = result1 * result2
print('모든 경우의 수: {}'.format(result))

-> 7! 곱하기 3!

  1. 조합
  • nCr 조합 경우의수 구하기
    -> nCr = nPr / r!
numN = int(input('numN 입력: '))
numR = int(input('numR 입력: '))

resultP = 1
resultR = 1
resultC = 1


for n in range(numN, numN-numR, -1):
    resultP *= n
print('resultP : {}'.format(resultP))           # nPr

for n in range(numR, 0, -1):
    resultR *= n
print('resultR : {}'.format(resultR))           # r!

resultC = int(resultP / resultR)
print('resultC: {}'.format(resultC))            # nCr

-> 순열과 팩토리얼 결과값을 각각 구하고나서 조합을 구함

result = (1/resultC) * 100
print('{}%'.format(round(result, 2)))

-> 카드 7장 중 3장을 뽑았을 때 그 세 장이 3,4,5일 확률 구하기

  1. 확률
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 *= n
    print('resultP: {}'.format(resultP))

    for n in range(numR, 0, -1):
        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('event1: {}'.format(event1))
event2 = proFun()
print('event2: {}'.format(event2))

probability = (event1 * event2) / sample
print('확률: {}%'.format(round(probability * 100, 2)))

-> 조합을 구하는 함수를 만들어서 확률계산에 이용

  • while문에서는 n+=1 꼭 넣어서 무한루프 안되도록 하기! for문은 알아서 돌아감

<제로베이스 데이터 취업 스쿨>

0개의 댓글