파이썬 기초 - 기초수학 연습문제

hs0820·2023년 6월 20일

파이썬

목록 보기
11/16
post-thumbnail

📝 파이썬 기초 - 기초수학 연습문제

📌 기초수학 연습문제

✏ 약수와 소수

  • 100부터 1000사이의 난수에 대해서 약수, 소수, 그리고 소인수를 출력하는 프로그램을 만들어보자.
import random

rNum = random.randint(100,1000)
print(rNum)

for n in range(1,rNum + 1):

    soinsuFlag = 0

    if rNum % n == 0:
        print('약수 : {}'.format(n))
        soinsuFlag += 1


    if n != 1:
        flag = True
        for i in range(2, n):
            if n % i == 0:
                flag = False
                break
        if (flag):
            print('소수 : {}'.format(n))
            soinsuFlag += 1

    if soinsuFlag >= 2:
        print('소인수: {}'.format(n))
  • 100부터 1000사이의 난수를 소인수분해를 하고 각각의 소인수에 대한 지수를 출력하는 프로그램을 만들어보자.
import random

rNum = random.randint(100,1000)
print(f'임의의 수 : {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}')

tempNum = 0
for i in soinsuList:
    if tempNum != i :
        print(f'{i}\'s count : {soinsuList.count(i)}')
        tempNum = i
↓
임의의 수 : 459
소인수 : 3
소인수 : 3
소인수 : 3
소인수 : 17
소인수 : [3, 3, 3, 17]
3's count : 3
17's count : 1

✏ 최대공약수

  • 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 i in range(1, (min(rNum1, rNum2) + 1)):
    if rNum1 % i == 0 and rNum2 % i == 0:
        print(f'공약수 : {i}')
        maxNum = i

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

if maxNum == 1:
    print(f'{rNum1}{rNum2}는 서로소')
↓
rNum1 : 545
rNum2 : 699
공약수 : 1
최대공약수 : 1
545699는 서로소

✏ 최소공배수

  • 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 i in range(1, (min(rNum1, rNum2) + 1)):
    if rNum1 % i == 0 and rNum2 % i == 0:
        print(f'공약수 : {i}')
        maxNum = i

minNum = (rNum1 * rNum2) // maxNum
print(f'최대공약수 : {maxNum}')
print(f'최소공배수 : {minNum}')
↓
rNum1 : 510
rNum2 : 144
공약수 : 1
공약수 : 2
공약수 : 3
공약수 : 6
최대공약수 : 6
최소공배수 : 12240

✏ 진법

  • 사용자가 입력한 수를 이용해서, 다음 내용에 따라 진법 변환하는 코드를 작성해보자.
import random

rNum = random.randint(1, 30)
bNum = bin(random.randint(1, 30))
oNum = oct(random.randint(1, 30))
hNum = hex(random.randint(1, 30))
print(f'rNum : {rNum}')
print(f'bNum : {bNum}')
print(f'oNum : {oNum}')
print(f'hNum : {hNum}')

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

print('bNum : 2진수({}) -> 10진수({})'.format(bNum, int(bNum, 2)))
print('oNum : 8진수({}) -> 10진수({})'.format(oNum, int(oNum, 8)))
print('hNum : 16진수({}) -> 10진수({})'.format(hNum, int(hNum, 16)))
↓
rNum : 3
bNum : 0b1001
oNum : 0o16
hNum : 0x1e
2진수 : 0b11
8진수 : 0o3
16진수 : 0x3
bNum : 2진수(0b1001) -> 10진수(9)
oNum : 8진수(0o16) -> 10진수(14)
hNum : 16진수(0x1e) -> 10진수(30)

✏ 등차수열

  • 다음 수열의 일반항을 구하고 n번째항의 값과 합을 구하는 프로그램을 만들어보자.
    {4, 10, 16, 22, 28, 34, 40, 46, 52, 58, 64...}
sNum = int(input('sNum 입력 : '))
dNum = int(input('dNum 입력 : '))
nNum = int(input('nNum 입력 : '))
fNum = int(input('fNum 입력 : '))

sequenceList=[]

def getSequence(s, d, n):
    sequenceList = [s]
    for i in range(1, n) :
        sequenceList.append(sequenceList[i-1] + d)

    return sequenceList

result = getSequence(sNum,dNum,nNum)

def sumSequence(f):
    value = 0
    for i in range(0, fNum):
        value += result[i]

    return value


sumSq = sumSequence(fNum)
print('sequenceList : {}'.format(result))
print('{}번째까지의 합 :{}'.format(fNum, sumSq))
↓
sNum 입력 : 4
dNum 입력 : 6
nNum 입력 : 10
fNum 입력 : 5
sequenceList : [4, 10, 16, 22, 28, 34, 40, 46, 52, 58]
5번째까지의 합 :80

valueN = sNum + (fNum - 1) * dNum
print('{}번쨰 항의 값 : {}'.format(fNum,valueN))
sumN = fNum * (sNum + valueN) / 2
print('{}까지의 합 : {}'.format(fNum, sumN))
↓
sNum 입력 : 4
dNum 입력 : 6
nNum 입력 : 10
fNum 입력 : 5
5번쨰 항의 값 : 28
5까지의 합 : 80.0

✏ 등비수열

  • 다음 수열의 일반항을 구하고 n번째항의 값과 합을 구하는 프로그램을 만들어보자.
sNum = int(input('sNum 입력 : '))
rNum = int(input('dNum 입력 : '))
nNum = int(input('nNum 입력 : '))
# fNum = int(input('fNum 입력 : '))

valueN = 0
sumN = 0
n = 1
while n <= nNum:

    if n == 1:
        valueN = sNum
        sumN += valueN
        n += 1
        continue

    valueN *= rNum
    sumN += valueN

    n+=1

print('{}번째 항의 값: {}'.format(nNum, valueN))
print('{}번째 항까지의 합: {}'.format(nNum, sumN))
↓
sNum 입력 : 2
dNum 입력 : 3
nNum 입력 : 10
10번째 항의 값: 39366
10번째 항까지의 합: 59048


valueN = sNum * (rNum ** (nNum - 1))
print('{}번째 항의 값: {}'.format(nNum, valueN))
sumN = sNum * (1 -(rNum ** nNum)) / (1-rNum)
print('{}번째 항까지의 합: {}'.format(nNum, sumN))
↓
sNum 입력 : 2
dNum 입력 : 3
nNum 입력 : 10
10번째 항의 값: 39366
10번째 항까지의 합: 59048.0

✏ 시그마

sNum = int(input('sNum 입력 : '))
rNum = int(input('dNum 입력 : '))
nNum = int(input('nNum 입력 : '))

valueN = 0; sumN = 0

n=1
while n <= nNum:

    if n == 1:
        valueN = sNum
        sumN += valueN
        print('{}번째 항까지의 합 : {}'.format(n, sumN))
        n+= 1
        continue

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

print('{}번째 항까지의 합 : {}'.format(nNum, format(sumN,',')))
↓
sNum 입력 : 2
dNum 입력 : 2
nNum 입력 : 30
1번째 항까지의 합 : 2
2번째 항까지의 합 : 6
3번째 항까지의 합 : 14
4번째 항까지의 합 : 30
5번째 항까지의 합 : 62
6번째 항까지의 합 : 126
7번째 항까지의 합 : 254
8번째 항까지의 합 : 510
9번째 항까지의 합 : 1022
10번째 항까지의 합 : 2046
11번째 항까지의 합 : 4094
12번째 항까지의 합 : 8190
13번째 항까지의 합 : 16382
14번째 항까지의 합 : 32766
15번째 항까지의 합 : 65534
16번째 항까지의 합 : 131070
17번째 항까지의 합 : 262142
18번째 항까지의 합 : 524286
19번째 항까지의 합 : 1048574
20번째 항까지의 합 : 2097150
21번째 항까지의 합 : 4194302
22번째 항까지의 합 : 8388606
23번째 항까지의 합 : 16777214
24번째 항까지의 합 : 33554430
25번째 항까지의 합 : 67108862
26번째 항까지의 합 : 134217726
27번째 항까지의 합 : 268435454
28번째 항까지의 합 : 536870910
29번째 항까지의 합 : 1073741822
30번째 항까지의 합 : 2147483646
30번째 항까지의 합 : 2,147,483,646

# sn = a1 * (1 - r^n) / (1-r)
valueN = sNum * (rNum ** (nNum - 1))
print('{}번째 항의 값: {}'.format(nNum, valueN))
sumN = sNum * (1 - (rNum ** nNum)) / (1-rNum)
print('{}번째 항까지의 합: {}'.format(nNum, format(int(sumN), ',')))
↓
sNum 입력 : 2
dNum 입력 : 2
nNum 입력 : 30
30번째 항의 값: 1073741824
30번째 항까지의 합: 2,147,483,646

✏ 계차수열

  • 수열의 일반항을 구하고, n항의 값을 출력하는 프로그램을 만들어 보자.
sNum = int(input('sNum 입력 : '))
nNum = int(input('nNum 입력 : '))

# an = a1 + (n-1) * d
# -> an = (3n^2 - 2n + 4) / 2
valueN = ((3*nNum ** 2)-(3*nNum) + 4) / 2
print('an의 {}번째 항의 값 : {}'.format(nNum, int(valueN)))
↓
sNum 입력 : 2
nNum 입력 : 11
an의 11번째 항의 값 : 167

✏ 피보나치수열

  • an = a(n - 2) + a(n - 1)
  • 피보나치수열에서 n항의 값과 n항까지의 합을 출력하는 합을 출력하는 프로그램을 만들어보자.
nNum = int(input('nNum 입력 : '))

valueN = 0; sumN = 0

valuePreN2 = 0
valuePreN1 = 0

n = 1
while n <= nNum:
    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(nNum, valueN))
print('{}번째 항까지의 합 : {}'.format(nNum, sumN))
↓
nNum 입력 : 10
10번째 항의 값 : 55
10번째 항까지의 합 : 143

✏ 팩토리얼

  • 팩토리얼 프로그램을 만들되, 반복문을 이용한 함수와 재귀 함수를 이용해서 구현해보고 또한, 파이썬에서 제공하는 모듈도 사용해 보자.
num = int(input('input number : '))

def facFun1(n):

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

    return fac


def facFun2(n):
    if n == 1:
        return n

    return n * facFun2(n-1)

print(f'facFun1 -> {num}! :{facFun1(num)}')
print(f'facFun2 -> {num}! :{facFun2(num)}')

import math

num2 = int(input('input number : '))
print(f'math.factorial -> {num2}! : {math.factorial(num2)}')input number : 10
facFun1 -> 10! :3628800
facFun2 -> 10! :3628800
input number : 10
math.factorial -> 10! : 3628800

✏ 군수열

  • 다음 수열을 보고 수열의 합이 최초 100을 초과하는 n번째 항의 값과 n을 출력하는 프로그램을 만들어보자.
flag = True
nCnt = 1; searchNC = 0; searchNP = 0
sumN = 0
n = 1
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

✏ 순열

  • 파이썬을 이용해서 순열들의 값을 구하는 프로그램을 만들어 보자.
# 5p2
nNum = int(input('nNum 입력 : '))
rNum = int(input('rNum 입력 : '))

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

print('result : {}'.format(result))
↓
nNum 입력 : 5
rNum 입력 : 2
n : 5
n : 4
result : 20
fNum1 = int(input('factorial 입력 : '))
fNum2 = int(input('factorial 입력 : '))

def getNoc(f1, f2):

    result1 = 1
    for n in range(f1, 0, -1):
        result1 *= n

    result2 = 1
    for n in range(f2, 0, -1):
        result2 *= n

    print('result1 : {}'.format(result1))
    print('result2 : {}'.format(result2))

    return result1 * result2

print('모든 경우의 수 : {}'.format(getNoc(fNum1, fNum2)))
↓
factorial 입력 : 5
factorial 입력 : 3
result1 : 120
result2 : 6
모든 경우의 수 : 720

✏ 조합

  • 파이썬을 이용해서 다음 조합들의 값을 구하는 프로그램을 만들어 보자.
 nNum = int(input('nNum 입력 : '))
rNum = int(input('rNum 입력 : '))

def getCombi(n,r):
    resultF = 1
    resultR = 1
    result = 0

    for n in range(n, (n-r), -1):
        resultF *= n
    for i in range(rNum, 0, -1):
        resultR *= i

    result = int(resultF / resultR)

    print('resultF : {}'.format(resultF))
    print('resultR : {}'.format(resultR))
    return result

print('조합 : {}'.format(getCombi(nNum,rNum)))
↓
nNum 입력 : 6
rNum 입력 : 2
resultF : 30
resultR : 2
조합 : 15

✏ 확률

  • 박스에 '꽝'이 적힌 종이가 6장 있고, '선물'이 적힌 종이가 4장이 있을 때, 파이썬을 이용해서 '꽝'3장과 '선물' 3장을 뽑는 확률(%)을 출력하자.
def getProb():
    nNum = int(input('nNum 입력 : '))
    rNum = int(input('rNum 입력 : '))

    resultP = 1
    resultR = 1
    resultC = 1

    for n in range(nNum, (nNum-rNum), -1):
        resultP *= n

    for r in range(rNum, 0, -1):
        resultR *= r

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

    return resultC

sample = getProb()
event1 = getProb()
event2 = getProb()

result = round(((event1 * event2) / sample) * 100,2)
print('probability : {}%'.format(result))
↓
nNum 입력 : 10
rNum 입력 : 6
resultP : 151200
resultR : 720
resultC : 210.0
nNum 입력 : 6
rNum 입력 : 3
resultP : 120
resultR : 6
resultC : 20.0
nNum 입력 : 4
rNum 입력 : 3
resultP : 24
resultR : 6
resultC : 4.0
probability : 38.1%

📢

  • 기초수학 강의를 듣고 연습문제를 풀어보며 또 다시 처음 듣는 것 같은 느낌을 받게 되었지만, 시간이 지나면서 아는 것들이 하나씩 나와서 약간의 자신감이 생기는 시간이었다.
    앞으로도 조금씩 자신감을 키워나가면서 나 자신을 성장시켜 나가야겠다.
profile
개발 스터디 노트

0개의 댓글