[Python 기초] 03-2 기초 수학 연습문제

홍랑·2021년 10월 14일
0

Python

목록 보기
4/6
*using Python - PyCharm Community Edition

👉 github - math basic Python full code


📚 약수와 소수

  • 100부터 1000 사이의 난수
  • 약수, 소수, 소인수 출력
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}')

📚 소인수와 소인수분해

  • 100부터 1000사이의 난수
  • 소인수분해 후 지수 출력
soinsuList = []

n = 2
while n <= rNum:
    if rNum % n == 0:
        print(f'소인수: {n}')
        soinsuList.append(n)
        rNum /= n
    else:
        n += 1

print(f'soinsuList: {soinsuList}')

📚 최대공약수

  • 100부터 1000사이의 2개의 난수
  • 공약수, 최대공약수 출력 후 서로소 확인
for n in range(1, (min(rNum1, rNum2)+1)):
    if rNum1 % n == 0 and rNum2 % n ==0:
        maxNum = n

print(f'최대공약수: {maxNum}')

if maxNum == 1:
    print(f'{rNum1}{rNum2}는 서로소이다.')

📚 최소공배수

  • 100부터 1000사이의 2개의 난수
  • 최대공약수와 최소공배수 출력
maxNum = 0
for n in range(1, (min(rNum1, rNum2)+1)):
    if rNum1 % n == 0 and rNum2 % n == 0:
        maxNum = n
print(f'최대공약수: {maxNum}')

minNum = (rNum1 * rNum2) // maxNum
print(f'최소공배수: {minNum}')

📚 진법

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

📚 등차수열

  • 수열의 n번째 항의 값과 합
# 공식 활용
# an = a1 + (n-1)*d
valueN = inputA1 + (inputN - 1) * inputD
print('{}번째 항의 값: {}'.format(inputN, valueN))

# sn = n(a1 + an) / 2
sumN = inputN * (inputA1 + valueN) / 2
print('{}번째 항까지의 합: {}'.format(inputN, int(sumN)))

📚 등비수열

  • 수열의 n번째 항의 값과 합
# 공식 활용
# an = a1 * r^(n-1)
valueN = inputA1 * (inputR ** (inputN - 1))
print('{}번째 항의 값: {}'.format(n, valueN))

# sn = a1 * (1 - r^n) / (1-r)
sumN = inputA1 * (1- (inputR ** inputN)) / (1 - inputR)
print('{}번째 항까지의 합: {}'.format(n, sumN))

📚 시그마

  • 첫째날 쌀 두톨, 둘째날부터 하루 전의 2배에 해당하는 쌀
  • 30일째 되는 날 받게 되는 쌀의 개수
# sn = a1 * (1 - r^n) / (1 - r)
sumN = inputA1 * (1 - (inputR ** inputN)) / (1 - inputR)
print('{}번째 항까지의 합: {}'.format(inputN, format(sumN, ',')))

📚 계차수열

# an = (3n^2 - 2n + 4) / 2

inputA1 = int(input('a1 입력 : '))
inputN = int(input('an 입력 : '))

valueN = ((3 * inputN ** 2) - (3 * inputN) + 4) / 2
print('an의 {}번째 항의 값: {}'.format(inputN, int(valueN)))

📚 피보나치수열

# an = a(n-2) + a(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))

📚 군 수열

  • 수열의 합이 최초 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 += 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))

📚 순열

  • nPr 순열 값 구하기 n(n-1)(n-2)...(n-r+1)
for n in range(numN, (numN - numR), -1):
    print('n : {}'.format(n))
    result *= n
print('result: {}'.format(result))


# 카드 7장 일렬 나열, 3장의 카드 서로 이웃하도록 나열
result1 = 1
result2 = 1

for n in range(fnum1, 0, -1):
    result1 *= n
print('result1: {}'.format(result1))

for n in range(fnum2, 0, -1):
    result2 *= n
print('result2: {}'.format(result2))

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

📚 조합

  • nCr = nPr / r!
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 = resultP / resultR
print('resultC: {}'.format(resultC))

📚 확률

  • 박스에 '꽝' 6장, '선물' 4장
    -'꽝' 3장, '선물' 3장 뽑는 확률
def proFun():
    numN = int(input('numN 입력: '))
    numR = int(input('numR 입력: '))

    resultP = 1
    resultR = 1
    resultC = 1

    # 순열(P)
    for n in range(numN, (numN - numR), -1):
        resultP *= n
    print("resultP: {}".format(resultP))

    # R(f)
    for n in range(numR, 0, -1):
        resultR *= n
    print("resultR: {}".format(resultR))

    # 조합(C)
    resultC = int(resultP / resultR)
    print("resultC: {}".format(resultC))

    return resultC

print('result: {}%'.format(round(((event1*event2)/sample)*100, 2)))
profile
호랑이 기운이 솟아나요🐯

0개의 댓글