[3주차] 기초수학 문제풀이

이철민·2023년 2월 15일

[오늘 배운 내용]

[약수와 소수]

  • 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:
        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 사이의 난수를 소인수분해 하고 각각의 소인수에 대한 지수를 출력하자.
import random

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

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

tempNum = 0
for s in soinsuList:
    if tempNum != s:
        print(f'{s}\'s count: {soinsuList.count(s)}')
        tempNum = s

[최대공약수]

  • 100부터 1000 사이의 2개의 난수에 대해 공약수와 최대공약수를 출력하고, 서로소인지 출력하는 프로그램을 만들자.
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)):     # min(n1, n2) 는 n1, n2 중 작은 숫자를 뽑아주는 함수
    if rNum1 % n == 0 and rNum2 % n == 0:
        print(f'공약수: {n}')
        maxNum = n

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

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

[최소공배수]

  • 100부터 1000사이의 2개의 난수에 대해서 최대공약수와 최소공배수를 출력하자.
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,rNum1)+1)):
    if rNum1 % n ==0 and rNum2 % n == 0:
        print(f'공약수: {n}')
        maxNum = n

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

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

[진법]

  • 10진수 -> 2, 8, 16진수 / x진수 -> 10진수 / x 진수 -> x 진수로 진법 변환하는 코드를 작성해보자.
# 10진수 -> 2, 8, 16 진수 변환
dNum = int(input('10진수 입력: '))

print('2진수: {}'.format(bin(dNum)))
print('8진수: {}'.format(oct(dNum)))
print('16진수: {}'.format(hex(dNum)))

# 2, 8, 16진수 -> 10진수 변환
print('2진수(0b10101) -> 10진수({})'.format(int('0b10101',2)))
print('8진수(0o135) -> 10진수({})'.format(int('0o135', 8)))
print('16진수(0x5f) -> 10진수({})'.format(int('0x5f', 16)))

# x 진수 -> x 진수 변환
print('2진수(0b10101) -> 8진수({})'.format(oct(0b10101)))
print('2진수(0b10101) -> 10진수({})'.format(int(0b10101)))
print('2진수(0b10101) -> 16진수({})'.format(hex(0b10101)))

print('8진수(0o675) -> 2진수({})'.format(bin(0o675)))
print('8진수(0o675) -> 10진수({})'.format(int(0o675)))
print('8진수(0o675) -> 16진수({})'.format(hex(0o675)))

print('16진수(0x45d) -> 2진수({})'.format(bin(0o675)))
print('16진수(0o45d) -> 8진수({})'.format(oct(0o675)))
print('16진수(0o45d) -> 10진수({})'.format(int(0o675)))

[등차수열]

  • {4, 10, 16, 22, 2, 34, 40, 46 ----} 의 등차수열을 구해보자.
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))
# 공식 활용
# an = a1 + (n-1)d
inputA1 = int(input('a1 입력: '))
inputD = int(input('공차 입력: '))
inputN = int(input('n 입력: '))

valueN = inputA1 + (inputN -1) * inputD
print('{}번째 항의 값: {}'.format(inputN, valueN))

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

[등비수열]

  • {2, 6, 18, 54, 162, 485 ---- } 의 등비수열은?
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

    valueN *= inputR
    sumN += valueN
    print('{}번째 항의 값: {}'.format(n, valueN))
    print('{}번째 항까지의 합: {}'.format(n, sumN))
    n += 1

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

valueN = inputA1 * inputR ** (inputN-1)
print('{}번째 항의 값: {}'.format(inputN, valueN))

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

[시그마]

  • 첫 째날 쌀 두톨을 받고 둘째 날부터는 하루 전의 2배에 해당하는 쌀을 받는다. 30일째 되는 날 받게 되는 쌀의 개수는?
# {2,4,8,16,32,64,128 ---- }

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, ',')))
# 공식 사용
# sn = a1 * (1-r^n) / (1-r)

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

[계차수열]

  • 다음 수열의 일반항을 구하고, n항의 값을 출력하는 프로그램을 만들자.
  • an = { 2, 5, 11, 20, 32, 47, 65, 86 ----- }
# bn = 3, 6, 9 12 15 18 ---
# bn의 1항부터 (n-1) 항까지의 합은 an - a1
# bn = 3n
# bn의 1항부터 (n-1)까지의 총합 = 3n(n-1)/2  = an - a1
# an = 3n(n-1)+4/2

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

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

[피보나치 수열]

  • 다음 수열의 n번째 항과 n번째 항까지의 값은?
  • { 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144 --- }
# an = a(n-2) + a(n-1)

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

[팩토리얼]

  • 반복문을 이용한 팩토리얼, 재귀함수를 이용한 팩토리얼, 파이썬에서 제공한 모듈을 이용한 팩토리얼 만들기.
# 반복문

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

    return n * facFun2(n-1)

num = int(input('input number: '))
print(f'{num}! : {facFun2(num)}')

# 파이썬 제공 모듈

import math

num = int(input('input number: '))
print(f'{num}! : {math.factorial(num)}')

[군수열]

  • 수열의 합이 최초 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='')      # 분자는 1씩 계속 커지니까 i, 분모는 1씩 계속 작아지니까 n-i+1

        sumN += i / (n-i+1)

        if sumN > 100:
            searchNC = i
            searchNP = n - i + 1
            flag = False
            break

        nCnt += 1

    print()
    n += 1

print('수열의 합이 최초 100을 초과하는 항, 값, 합: {}항, {}/{}, {}'.format(nCnt, searchNC, searchNP, round(sumN, 2)))

[순열]

  • 파이썬을 이용해 다음 순열들의 값을 구하는 프로그램을 만들어보자. (9P4, 6P2)
  • 순열 값: n(n-1)(n-2) --- (n-r+1)
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부터 7까지 카드 7장을 일렬로 나열하되 2, 4, 7 카드가 서로 이웃하도록 나열하는 모든 경우의 수
# 5! * 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))

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

[조합]

  • 다음 조합들의 값을 구하는 프로그램 만들기 (9C4, 6C2)
  • 조합: nPr / r!
numN = int(input('numN 입력: '))
numR = int(input('numR 입력: '))

resultP = 1   # 순열
resultR = 1   # r!
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))

# 1~7 중 3장을 선택했을때 3,4,5가 동시에 선택될 확률은?

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

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

[확률]

  • 박스에 꽝이 적힌 종이 6장, 선물 적힌 종이 4장이 있을때, 꽝 3장과 선물 3장 뽑을 확률은??
  • 뽑고자 하는 경우의 수(6C3 * 4C3) / 10장 중 6장을 뽑는 전체 경우의 수(10C6)
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))

    # r!
    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('probability: {}%'.format(round(probability * 100, 2)))

[오늘의 소감]

평소보다 집중이 잘 안되고 컨디션이 떨어진게 느껴지는 날... 가끔은 이런 날도 있으니 스스로를 너무 자책하지 말자고 생각하고 넘어가려 한다..!

profile
늘 온 마음을 다해 :)

0개의 댓글