[python] 수열, 순열, 조합, 확률

svenskpotatis·2023년 8월 17일
0

01 약수와 소수 ~ 20 계차수열(파이썬)

약수와 소수

약수: 어떤 수를 나누어 떨어지게 하는 수

#python 약수 구하기: 나머지가 0인 수 찾기
inputNumber = int(input("0보다 큰 정수 입력"))

for number in range(1, (inputNumber + 1)):
    if inputNumber % number == 0:
        print('{}의 약수: {}'.format(inputNumber, number))

소수: 1과 그 수 자신만을 약수로 가지는 수

# python 소수 찾기
inputNumber = int(input("0보다 큰 정수 입력"))

for number in range(2, (inputNumber + 1)):
    flag = True
    for n in range(2, number):
        if number % n == 0:
            flag = False
            break

    if (flag):
            print('{}: 소수'.format(number))
    else:
            print('{}: 합성수'.format(number))

소인수

소인수: 약수(인수) 중에서 소수인 숫자

# 소인수분해
inputNumber = int(input("1보다 큰 정수 입력: "))

n = 2
while n <= inputNumber:
    if inputNumber % n == 0:
        print('소인수: {}'.format(n))
        inputNumber /= n # inputNumber에 몫 재할당
    else:
        n += 1

공약수

공약수: 두 개 이상의 수에서 공통된 약수

num1 = int(input('1보다 큰 정수 입력: '))
num2 = int(input('1보다 큰 정수 입력: '))
maxNum = 0

for i in range(1, (num1+1)):
    if num1 % i == 0 and num2 % i == 0:
        print('공약수: {}'.format(i))
        maxNum = i
print('최대공약수: {}'.format(maxNum))

유클리드 호제법

: x, y의 최대공약수는 y, r(x%y)의 최대공약수와 같다.

num1 = int(input('1보다 큰 정수 입력: '))
num2 = int(input('1보다 큰 정수 입력: '))

temp1 = num1; temp2 = num2

while temp2 > 0:
    temp = temp2
    temp2 = temp1 % temp2
    temp1 = temp

print('{}, {}의 최대공약수: {}'.format(num1, num2, temp1))

for n in range(1, (temp1+1)):
    if temp1 % n == 0:
        print('{}, {}의 공약수: {}'.format(num1, num2, n))

최소공배수

num1 = int(input('1보다 큰 정수 입력: '))
num2 = int(input('1보다 큰 정수 입력: '))
maxNum = 0

for i in range(1, (num1+1)):
    if num1 % i == 0 and num2 % i == 0:
        print('공약수: {}'.format(i))
        maxNum = i

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

minNum = (num1 * num2) // maxNum #두 수의 곱 / 최대수약수 = 최소공배수
print('최소공배수: {}'.format(minNum))

진법

  • 10진수 -> x진수
    2진수 binary: bin()
    8진수 octal: oct()
    16진수 hexadecimal: hex()
    //변환 결과는 문자열
print('{0:#b}, {0:#o}, {0:#x}'.format(num))
print('2진수: {}'.format(format(30, '#b')))
>>>
2진수: 0b11110

print('2진수: {}'.format(format(30, 'b')))
>>>
2진수: 11110
  • x진수 -> 10진수
print('2진수(0b11110) -> 10진수({})'.format(int('0b11110', 2)))
print('8진수(0o36) -> 10진수({})'.format(int('0o36', 8)))
print('16진수(0x1e) -> 10진수({})'.format(int('0x1e', 16)))

📌 수열

: 규칙성을 가지고 나열되어 있는 수들

  • 일반항, 정의역
  • an=SnSn1a_{n} = S_{n} - S_{n-1}

등차수열

: 연속된 두 항의 차이(공차, d)가 일정한 수열

  • 일반항 an=a1+d(n1)a_{n} = a_{1} + d(n-1)
  • 등차중항 an=(an+1+an1)/2a_{n} = (a_{n+1} + a_{n-1}) / 2
  • 등차수열의 합 Sn=n(a1+an)/2S_{n} = n(a_{1} + a_{n}) / 2
# 등차수열 - n번째 항의 값 출력
inputN1 = int(input('a1 입력: '))
inputD = int(input('공차 입력: '))
inputN = int(input('n 입력: '))

valueN = 0
n = 1
while n <= inputN:
    if n==1:       #첫 번째 항
        valueN = inputN1
        print('{}번째 항의 값: {}'.format(n, valueN))
        n += 1
        continue

    valueN += inputD   #두 번쨰 항~
    print('{}번째 항의 값: {}'.format(n, valueN))
    n += 1

print('{}번째 항의 값: {}'.format(inputN, valueN))
#공식 이용
inputN1 = int(input('a1 입력: '))
inputD = int(input('공차 입력: '))
inputN = int(input('n 입력: '))

valueN = inputN1 + (inputN-1) * inputD
print(f'{inputN}번째 항의 값: {valueN}')

등비수열

: 연속된 두 항의 비(공비, r)가 일정한 수열

  • 일반항 an=a1rn1a_{n} = a_{1} * r^{n-1}
  • 등비중항 an2=an1an+1{a_{n}}^2 = a_{n-1} * a_{n+1}
  • 등비수열의 합 Sn=a1(1rn)/(1r)S_{n} = a_{1}(1-r^n) / (1-r)

시그마(∑)

: 수열의 합

계차수열

: 수열 {ana_{n}}에 대하여 bn=an+1anb_{n} = a_{n+1} - a_{n}일 때 {bnb_{n}}은 {ana_{n}}의 계차수열

21 피보나치 수열 ~ 30 확률(파이썬)

피보나치 수열

  • an=an2+an1a_{n} = a_{n-2} + a_{n-1}
inputN = int(input('n 입력: '))

valueN = 0   #n번쨰 항
sumN = 0     #n번째 항까지 합

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(f'{inputN}번째 항의 값: {valueN}')
print(f'{inputN}번째 항까지의 합: {sumN}')

팩토리얼

#재귀함수 이용
inputN = int(input('n 입력: '))
def factorialFun(n):
    if n == 1: return 1
    return n * factorialFun(n - 1)

print(f'{inputN} 팩토리얼: {factorialFun(inputN)}')

군수열

: 여러 개의 항을 묶었을 때 규칙성을 가지는 수열

1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, ...
=>
(1), (1, 2), (1, 2, 3), (1, 2, 3, 4), (1, 2, 3, 4, 5),...

  • 5군: (1, 2, 3, 4, 5)

📌 순열(Permutation)

: n개에서 r개를 택하여 나열하는 경우의 수(순서 고려)

  • nPr=n(n1)(n2)...(nr+1)=n!(nr)!_{n}P_{r} = n(n-1)(n-2)...(n-r+1) = \frac{n!}{(n-r)!}
    from itertools import permutations
    sets = [n개]
    data = itertools.permutation(sets, r개)

원순열

: 시작과 끝의 구분이 없는 순열

  • n!n\frac{n!}n or (n1)!(n-1)!

📌 조합(Combination)

: 순서 상관없이 n개 중 r개 선택

  • nCr=nPrr!=n!r!(nr)!_{n}C_{r} = \frac{_{n}P_{r}}{r!} = \frac{n!}{r!(n-r)!}
    from itertools import combinations
    sets = [n개]
    data = itertools.combinations(sets, r개)

📌 확률

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 = resultP*n

    print('resultP: {}'.format(resultP))

    for n in range(numR, 0, -1):
        resultR = resultR*n
    print(f'resultR: {resultR}')

    resultC = int(resultP/resultR)
    print(f'resultC: {resultC}')

    return resultC

sample = proFun()
print(f'sample: {sample}')

event1 = proFun()
print(f'event1: {event1}')

event2 = proFun()
print(f'event2: {event2}')

probability = (event1 * event2) / sample
print(f'probability: {round(probability*100, 2)}%')

0개의 댓글