Ch1 기초수학 01-17 (기초1-4)

김민지·2023년 3월 15일
0

Part 02. 수학

목록 보기
1/3
  1. 약수
  • 어떤 수를 나누어 떨어지게 하는 수 (나누었을 때 나머지가 0인 수)
    ex) 15의 약수: 1, 3, 5, 15
  • 입력한 수의 약수 구하기 (나머지가 0인 수 찾기)
inputNum = int(input('0보다 큰 정수 입력: '))

for number in range(1, inputNum+1):
    if inputNum % number == 0:
        print('{}의 약수: {}'.format(inputNum, number))
  1. 소수
  • 1과 자신만을 약수로 가지는 수 (단, 1은 소수가 아님)
    ex) 2, 3, 5, 7, 11, 13, 17, 19
    -> 1과 자신 외에 나누어떨어지는 수가 없는 수
  • 입력한 수까지의 소수 구하기
inputNum = int(input('0보다 큰 정수 입력: '))

for number in range(2, inputNum+1):
    flag = True
    for n in range(2, number):      #number가 2부터 number-1까지의 숫자 중 약수가 있는지 판별 (약수가 있으면 소수가 X. 합성수임)
        if number % n == 0:
            flag = False
            break              #하나라도 약수가 있기 때문에 for문을 더이상 반복하지 않아도 되니까 반복문을 끝냄

    if flag:
        print('{} : 소수!!'.format(number))
    else:
        print('{} : 합성수!!'.format(number))
  1. 소인수분해
  • 소인수 : 약수(인수) 중에서 소수인 숫자
    ex) 20의 약수: 1, 2, 4, 5, 10, 20 / 20의 소인수: 2, 5
  • 소인수분해 : 1보다 큰 정수를 소인수의 곱으로 나타낸 것
    ex) 20의 소인수분해: 2 X 10(2X5) = 2X2X5
  • 소인수분해를 이용해서 약수를 쉽게 구할 수 있음
    ex) 20의 소인수분해: 2^2X5 -> 4의 약수(1,2,4)와 5의 약수(1,5)끼리의 곱의 모든 경우의 수가 20의 약수가 됨
  • 입력한 수를 소인수분해하기
inputNum = int(input('1보다 큰 정수 입력: '))

n = 2
while n <= inputNum:
    if inputNum % n == 0:
        print('소인수: {}'.format(n))
        inputNum /= n              #inputNum = inputNum / n
    else:
        n += 1
  • 입력한 수에 x를 곱하면 y의 제곱이 된다고 할 때, x에 해당되는 가장 작은 정수 구하기
    -> 소인수분해를 해서 소인수의 갯수가 홀수인 것을 구하면 됨
inputNum = int(input('1보다 큰 정수 입력: '))

n = 2
searchNumbers = []

while n <= inputNum:
    if inputNum % n == 0:
        print('소인수: {}'.format(n))
        if searchNumbers.count(n) == 0:
            searchNumbers.append(n)            #리스트에 n을 추가
        elif searchNumbers.count(n) == 1:
            searchNumbers.remove(n)            #리스트에 있는 n을 삭제
        inputNum /= n
    else:
        n += 1

print('searchNumbers: {}'.format(searchNumbers))
  1. 최대공약수
  • 공약수 : 두 개 이상의 수에서 공통된 약수
    ex) 12(1,2,3,4,6,12)와 20(1,2,4,5,10,20)의 공약수 : 1,2,4
  • 최대공약수 : 공약수 중 가장 큰 수
    ex) 12와 20의 최대공약수 : 4
  • 소인수분해를 이용해 최대공약수, 공약수를 구할 수 있음
    -> 최대공약수 : 두 수에서 공통인 소인수의 거듭제곱에서 지수가 작은 수를 모두 곱함
    -> 공약수 : 최대공약수의 약수
    ex) 36=2^2X3^2, 60=2^2X3X5 -> 밑 중 2,3이 공통 -> (지수가 작은걸로) 2^2X3=12가 최대공약수
  • 두 수를 더이상 나누어지지 않을때까지 소수로 똑같이 나눗셈하면(소수끼리의 곱) 최대공약수를 쉽게 구할 수 있음
  • 공약수와 최대공약수 구하기
num1 = int(input('1보다 큰 정수 입력: '))      #num1 < num2 라고 가정하고 품
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                              #계속 공약수가 새로 들어가면서 마지막 공약수(최대공약수)가 maxNum에 할당됨

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))
  1. 최소공배수
  • 공배수 : 두 개 이상의 수에서 공통된 배수
  • 최소공배수 : 공배수 중 가장 작은 수
  • 소인수분해를 이용해서 최소공배수, 공배수 구하기
    -> 최소공배수: 공통인 소인수의 거듭제곱에서 지수가 큰수, 공통아닌 수를 모두 곱하기
    -> 공배수: 최소공배수의 배수
  • 소수로 나눗셈하고 남은값 모두 곱하기
minNum = (num1 * num2) // maxNum

print('최소공배수: {}'.format(minNum))

-> 최소공배수는 두 수를 곱한 수를 최대공약수로 나눈 몫과 같음

  • 세 개의 수의 최소공배수 구하기
    -> 두 수의 최소공배수부터 구하고, 그 최소공배수와 세 번째 수의 최소공배수를 구하기(두 번의 과정 거침)
  1. 진법
  • 진법 : 특정 숫자 몇 개를 사용하여 수를 표시하는 방법

    2진법 : 0, 1 사용
    8진법 : 0~7 사용
    10진법 : 0~9 사용
    16진법 : 0~9, A~F 사용 (대소문자 상관X)

  • 10진수를 X진수로 변환 -> X로 나누기

  • 10진수 -> 2진수 : ex) 8을 2로 나누기(더이상 나눌수 없을때까지) -> 한번 한번의 나머지를 왼쪽부터 붙이기 -> 1000

  • X진수를 10진수로 변환 -> 제곱에 곱하기

  • 2진수 -> 10진수 : 2진수의 일의자리부터 순서대로 2의 0,1,2,3제곱을 해주고 이거에 각각 자리수를 곱해 더함 (2진수에서 0은 계산안해도됨)

  • 8진수 -> 10진수 : 8의 0,1,2,3제곱을 자리수에 곱해 더함

  • X진수 -> 2진수, 8진수, 16진수

    2진수: bin(수) -> 결과: 0b2진수
    8진수: oct(수) -> 결과: 0o8진수
    16진수: hex(수) -> 결과: 0x16진수
    -> 변환결과의 자료형은 문자열(string)

  • 포맷함수 이용하기

    2진수: format(수, '#b') -> #을 없애면 0b,0o,0x가 사라지고 수만 출력됨
    8진수: format(수, '#o')
    16진수: format(수, '#x')

print('{0:#b}, {0:#o}, {0:#x}'.format(dNum, dNum, dNum))
  • x진수 -> 10진수 (int()이용)

    2진수: int('0b11110', 2)
    8진수: int('0o36', 8)
    16진수: int('0x1e', 16)

  • '문자열', 몇진수인지 표기 안해도 ㄱㅊ. int() 자체가 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)))
  1. 수열
  • 수열 : 규칙성을 가지고 나열되어 있는 수들
  • 항 : a1, a2, a3..
  • 일반항 : an
    ex) an = 2n + 1 (수열의 규칙성)
  • 수열의 합 Sn = a1 + a2 + a3 + ... + an
  • an = Sn - S(n-1) (단, n>=2일 경우) (a1=S1)
  1. 등차수열
  • 등차수열 : 연속된 두 항의 차이가 일정한 수열
  • 공차(d) : 각 항 간의 차
  • 등차수열 일반항
    -> an = a1 + (n-1)d
  • 등차중앙 : 연속된 세 항에서 가운데 항
    -> (a(n-1) + a(n+1)) / 2 = an (등차중앙)
  • 등차수열의 합
    -> Sn = a1 + a2 + ... + a(n-1) + an
    -> Sn = n(a1+an) / 2
  1. 등비수열
  • 등비수열 : 연속된 두 항의 비가 일정한 수열
  • 공비(r) : 각 항 간의 비
  • 등비수열 일반항
    -> an = a1 * r^(n-1)
  • 등비중앙 : 연속된 세 항에서 가운데 항
    -> a(n-1) * a(n+1) = an^2
  • 등비수열의 합
    -> Sn = a1 * (1-(r^n)) / (1-r)

<제로베이스 데이터 취업 스쿨>

0개의 댓글