Study_note(zb_data)/Python

스터디 노트 (기초 수학 문제풀이 31 ~ 45)_0718

KloudHyun 2023. 7. 20. 12:08

(기초 수학 문제풀이)

📌 [연습문제] 약수

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

#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: #랜덤 난수가 num으로 나누어 떨어질 때, 약수가 되고 반복 실행
        print(f'rNum의 약수 : {num}')
        soinsuFlag += 1 #소인수 플래그에 1을 추가한다.

#소수
    if num != 1: #소수는 1을 제외하기 때문에, 2부터 시작
        flag = True
        for n in range(2, num): 
            if num % n == 0: #
                flag = False
                break

        if(flag):
            print(f'rNum의 소수 : {num}')
            soinsuFlag += 1 #소인수 플래그에 1을 추가한다.
#소인수
    if soinsuFlag >= 2: #소수와 약수 둘다 만족하면 소인수이다.
        print(f'[소인수] : {num}')

- 100부터 1000사이의 난수를 소인수분해하고 소인수에 대한 지수를 출력하는 프로그램을 만들어보자

import random

rNum = random.randint(100, 1000)

print(f'rNum:{rNum}')

List = []

n = 2

while n <= rNum: 
    if rNum % n == 0: #랜덤 난수가 n과 나누어 떨어질 때
        print(f'소인수 : {n}') #소인수를 출력하고 
        List.append(n) #소인수를 리스트에 넣는다
        rNum /= n #그리고 n으로 계속 나누기 시도 (안된다면 else문으로)

    else:
        n+=1 #안되면 n에 +1 을 해서 다음 숫자로 나눠본다 (반복)

print(f'List = {List}')

tempNum = 0
for s in List:
    if tempNum != s: #tempNum이 s와 같지 않을 때, 
        print(f'{s}\'s count : {List.count(s)}') #List에 있는 숫자 들의 개수를 센다
        tempNum = s

📌 [연습문제] 최대공약수

- 100부터 1000사이의 난수에 대해서 최대공약수를 구하는 프로그램을 만들어보자

import random

rNum1 = random.randint(100, 1000)
rNum2 = random.randint(100, 1000)


maxNum = 0
numList = []

for n in range(1, (min(rNum1, rNum2)+1)): 
#난수 두개중 어떤게 제일 작은 숫자일지 모르니 min 함수를 이용, 최소값으로 반환

    if rNum1 % n == 0 and rNum2 % n == 0: #두 숫자가 n으로 나누어 떨어질 때
        numList.append(n) #n을 list에 넣는다.

print(f'{rNum1}, {rNum2} numList : {numList}')  

maxNum = numList.pop() #list에 있던 숫자 중 제일 높은 숫자를 뽑는다.

print(f'{rNum1}, {rNum2} maxNum : {maxNum}')

if maxNum == 1: #list에 숫자 1만 있으면, 공약수가 1밖에 없기 때문에, 서로소이다.
    print(f'{rNum1}과 {rNum2}는 서로소이다.')

📌 [연습문제] 최소공배수

- 100부터 1000사이의 난수에 대해서 최대공약수를 구하는 프로그램을 만들어보자

#100부터 1000사이의 난수에 대해서 최소공배수를 구하는 프로그램을 만들어보자
import random

rNum1 = random.randint(100, 1000)
rNum2 = random.randint(100, 1000)

maxNum = 0
numList = []

for n in range(1, (min(rNum1, rNum2)+1)):
    if rNum1 != rNum2:
        if rNum1 % n == 0 and rNum2 % n == 0: #공약수를 구한다.
            numList.append(n) #list에 공약수를 넣고
            maxNum = n #maxNum에 n을 할당한다 (숫자가 계속 높아지기 때문에 자동으로 최대 공약수가 구해짐)

print(f'{rNum1}, {rNum2} List = {numList}') #공약수 리스트
print(f'{rNum1}, {rNum2} MaxNum = {maxNum}') #최대 공약수

minNum = rNum1 * rNum2 // maxNum #최소 공배수는 두 수를 곱하고 이를 최대 공약수로 나누면 구해진다.

print(f'{rNum1}, {rNum2} MinNum = {minNum}') #최소 공배수

📌 [연습문제] 진법 변환

- 100부터 1000사이의 난수에 대해서 최대공약수를 구하는 프로그램을 만들어보자

#진법 변환

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진수(0o57) -> 2진수 ({})'.format(bin(0o57)))
print('8진수(0o57) -> 10진수 ({})'.format(int(0o57)))
print('8진수(0o57) -> 16진수 ({})'.format(hex(0o571)))

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

📌 [연습문제] 등차수열

- 등차수열의 일반항, 합 등을 구하는 프로그램을 만들어보자

input_a1 = int(input('ai 입력 : '))
input_d = int(input('공차 d 입력 : '))
input_an = int(input('n번째 항 입력 : '))

value_N = 0 #n항의 값
sum_N = 0 #n항까지의 합
n = 1

while n<=input_an: 

    if n == 1:
        value_N = input_a1 #첫번째 항의 값은 a1과 같다
        sum_N = value_N #동일
        print('{}번째 항의 값 : {}'.format(n, value_N))
        print('{}번째 항까지의 합 : {}'.format(n, sum_N))
        n+=1 #무한루프에 빠지지 않게끔 조건을 걸어줌
        continue

    else:
        value_N += input_d #공차를 계속 더해준다 (등차수열)
        sum_N += value_N #공차를 더해준 밸류값을 합에 계속 더해줌 (등차수열의 합)
        print('{}번째 항의 값 : {}'.format(n, value_N))
        print('{}번째 항까지의 합 : {}'.format(n, sum_N))
        n+=1 #무한루프에 빠지지 않게끔 조건을 걸어줌
print()

print('{}번째 항의 값 : {}'.format(input_an, value_N))
print('{}번째 항까지의 합 : {}'.format(input_an, sum_N))

#an = a1 + (n-1) *d #등차 수열의 일반항

value_N = input_a1 + (input_an -1) *input_d
print('{}번째 항의 값 : {}'.format(input_an, value_N))

#sn = n(a1+an) /2 #등차 수열의 합
sum_N = input_an*(input_a1 + value_N) / 2
print('{}번째 항까지의 합 : {}'.format(input_an, int(sum_N)))

📌 [연습문제] 등비수열

- 등비수열의 일반항, 합 등을 구하는 프로그램을 만들어보자

#등비수열의 일반항, 합 등을 구하는 프로그램을 만들어보자

input_a1 = int(input('ai 입력 : '))
input_r = int(input('공비 r 입력 : '))
input_an = int(input('n번째 항 입력 : '))

valueN = 0
sumN = 0
n = 1

while n<=input_an:

    if n == 1:
        valueN = input_a1 #1번째 항 = a1
        sumN = valueN #1번째 항까지의 합 = 1번째 항
        print('{}번째 항의 값 : {}'.format(n, valueN))
        print('{}번째 항까지의 합 : {}'.format(n, sumN))
        n+=1 #무한루프에 빠지지 않도록 n을 걸어준다
        continue
    else:
        valueN *= input_r #밸류에 공비를 계속 곱해준다.
        sumN += valueN #등비수열의 합에 밸류를 계속 더해준다
        print('{}번째 항의 값 : {}'.format(n, valueN))
        print('{}번째 항까지의 합 : {}'.format(n, sumN))
        n+=1
print()
print('{}번째 항의 값 : {}'.format(input_an, valueN))
print('{}번째 항까지의 합 : {}'.format(input_an, sumN))

an = a1 * r^(n-1) #등비수열의 일반항
sn = a1 * (1-r^n) / 1-r #등비수열의 합

valueN2 = input_a1 * input_r ** (input_an - 1)
sumN2 = input_a1 * (1 - (input_r ** input_an)) / (1-input_r)
print('{}번째 항의 값 : {}'.format(input_an, valueN2))
print('{}번째 항까지의 합 : {}'.format(input_an, int(sumN2)))

📌 [연습문제] 계차수열

출처 : 제로베이스 데이터 스쿨

#다음 수열의 일반항을 구하고, n항의 값을 출력하는 프로그램을 만들어보자 (계차수열)
#시그마 k = 1 -> n-1까지의 합 = an - a1 이걸로 an을 구한다.
#구한 an 으로 항의 값을 출력한다.
#an 2, 5, 11, 20, 32, 47, 65, 86, 110, 137, 167...
#bn 3, 6, 9, 12, 15, 18 ....

an = (3n^2 - 3n + 4) / 2
input_a1 = int(input('ai 입력 : '))
input_an = int(input('n번째 항 입력 : '))

valueN = (3 * input_an ** 2 - 3*(input_an) + 4 ) / 2

print('{}번째 항의 값 : {}'.format(input_an, int(valueN)))

📌 [연습문제] 피보나치 수열

#1, 1, 2, 3, 5, 8, 13, 21, 34 ...
input_an = int(input('n번째 항 입력 : '))

valueN = 0; sumN = 0
valuePreN2 = 0 #valueN에서 2번째 전의 항
valuePreN1 = 0 #valueN에서 1번째 전의 항

n=1

while n<=input_an:
    if n == 1 or n == 2:
        valueN = 1 #1, 2번째 항은 1이다
        valuePreN2 = valuePreN1 #N2 항은 N1항이 되고
        valuePreN1 = valueN #N1항은 valueN이 된다
        sumN += valueN #valueN은 sum에 계속 더해진다.
        n+=1

    else:
        valueN = valuePreN1 + valuePreN2 #N1 항과 N2항을 더하면 valueN이 된다 (1+1 = 2)
        valuePreN2 = valuePreN1 
        valuePreN1 = valueN
        sumN += valueN
        n+=1

print('{}번째 항 : {}'.format(input_an, valueN))
print('{}번째 항까지의 합 : {}'.format(input_an, sumN))

📌 [연습문제] 팩토리얼 구하기

def facFun(n):
    fac = 1
    for n in range(1, n + 1): #실질적으로는 1~n까지
        fac = fac * n #1~n까지 계속 곱한다 (팩토리얼의 정의)

    return fac

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

def facFun2(n): #재귀함수

    if n == 1:
        return n

    return n * facFun2(n-1)

print(f'{num}! : {facFun2(num)}')

import math #math 모듈을 활용.
num = int(input('input number : '))
print(f'{num}! : {math.factorial(num)}')

📌 [연습문제] 계차수열 2

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

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

📌 [연습문제] nPr 순열 구하기

#9P4 = n(n-1)....(n-r+1)! - 9P4 > 9*8*7*6 
numN = int(input('numN 입력 : '))
numR = int(input('numR 입력 : '))

resultP = 1
resultR = 1

for n in range(numN, numN - numR, -1): # 9P4 구하기

    print('n = {}'.format(n))
    resultP *= n

print('result = {}'.format(resultP))


for n in range(numR, 0, -1): # r! 구하기

    print('n = {}'.format(n))
    resultR *= n

print('result = {}'.format(resultR))

#9C4
resultC = int(resultP/resultR) #nCr = nPr / r!

print('nCr = {}'.format(resultC))

📌 [연습문제] nPr 순열 구하기

numN = int(input('numN 입력 : '))
numR = int(input('numR 입력 : '))

resultR=1
resultP=1
resultC=1

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

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

resultC = int(resultP/resultR) #nCr 구하기

print('resultC = {}'.format(resultC))

result = (1/resultC) * 100 #확률 구하기

print('result = {}%'.format(round(result, 2)))

📌 [연습문제] 확률 구하기 

- 6C3 * 4C3 / 10C6 구하기

제로베이스 데이터 스쿨

def Function():

    numN = int(input('numN 입력 : '))
    numR = int(input('numR 입력 : '))

    resultP = 1
    resultR = 1
    resultC = 1

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

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

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

    return resultC

sample = Function()
print('sample : {}'.format(sample))

event1 = Function()
print('event1 : {}'.format(event1))

event2 = Function()
print('event2 : {}'.format(event2))

result = (event1 * event2) / sample

print('최종 확률 : {}%'.format(round(result*100, 2)))
>>
numN 입력 : 10
numR 입력 : 6
resultP = 151200
resultR = 720
resultC = 210
sample : 210
numN 입력 : 6
numR 입력 : 3
resultP = 120
resultR = 6
resultC = 20
event1 : 20
numN 입력 : 4
numR 입력 : 3
resultP = 24
resultR = 6
resultC = 4
event2 : 4
최종 확률 : 38.1%