[zero-base/] DS Part 2. 기초 수학 - 11일차 스터디 노트

손윤재·2023년 12월 19일

제로베이스 DS 22기

목록 보기
12/55
post-thumbnail

🎫 약수,소수

약수는 어떤 수를 나누어 떨어지게 하는 수이다.

  • 입력된 수를 1부터 입력수까지 for문을 돌며 나누어 나머지가 0인 수를 찾는다.

    def Divisor(inputNum):
         divisors = []
         for number in range(1, (inputNum + 1)):
             # 나머지가 0인 숫자 찾기
             if inputNum % number == 0:
                 divisors.append(number)
    
         return divisors

소수는 1과 그 수 자신만을 약수로 가지는 수이다.
단, 1은 소수에 포함되지 않는다.

  • 2부터 입력된 수까지 차례대로 돌면서 존재하는 소수를 찾는다.

  • 각 수(n)를 2부터 (n-1)까지 하나하나 나누었을 때 나누어 떨어지는 수가 있으면 자기자신(n)말고도 약수가 존재하므로 소수가 아니다.

  • 소수는 2를 제외하고 모두 홀수이므로 소수 판단은 홀수만 한다.

    def primeNumber(input_num):
        primes = []        
                
        for number in range(1, (input_num + 1), 2):
            # 소수의 유일한 짝수는 2!!
            if number == 1: number += 1
    
            flag = True
            for i in range(2, number):
                if number % i == 0:
                    flag = False
                    break
            
            if flag:  primes.append(number)
            
        return primes



🎫 소인수

약수(인수)이면서 동시에 소수인 수

  • 소인수분해 원리를 이용해 소인수를 구한다.!
    inputNumber = int(input('1보다 큰 정수 입력: '))
    
     n = 2
     while n <= inputNumber:
          if inputNumber % n == 0:
              print('소인수: {}'.format(n))
              inputNumber /= n 👈 #소인수분해 원리
          else:
              n += 1



🎫 최대공약수

두 개 이상의 수에서 공통된 약수(공약수) 중 가장 큰 수

  • 공약수는 2개 이상의 수에 동시에 나누어 떨어지는 수를 구하면 된다.

  • 공약수는 비교하는 수 중 가장 작은 수보다 클 수 없다.

    # 수 세개의 최대공약수
     num1 = int(input('1보다 큰 정수 입력: '))
     num2 = int(input('1보다 큰 정수 입력: '))
     num3 = int(input('1보다 큰 정수 입력: '))
     min_num = min(num1, num2, num3)
     gcd = 0
    
     for i in range(1, (min_num + 1)):
         if num1 % i == 0 and num2 % i == 0 and num3 % i == 0:
             print('공약수: {}'.format(i))
             gcd = i
    
     print('최대공약수: {}'.format(gcd))

📌 유클리드 호제법

  • 유클리드 호제법을 이용해 최대공약수를 구할 수 있다.

  • 유클리드 호제법이란?
    두 정수 a, b의 최대공약수를 G(a, b)라고할 때,
    정수 a, b, Q(몫), R(나머지) (b != 0, a > b)에 대하여
    a = bQ + R이면 G(a, b) = G(b, r)이 성립한다는 이론이다.

  • 재귀함수를 이용해 b자리 나머지가 0일 때까지 진행한다.

    def Euclidean(a, b):
         if b == 0: return a
    
         return Euclidean(b, (a % b))



🎫 최소공배수

두 개 이상의 수에서 공통된 배수(공배수) 중 가장 작은 수

  • 최소공배수는 최대공약수를 먼저 구한 후 연산으로 구할 수 있다.

  • 두 수의 곱을 최대공약수로 나눈 몫이 최소공배수이다.

    #수 두개의 최소공배수
     num1 = int(input('1보다 큰 정수 입력: '))
     num2 = int(input('1보다 큰 정수 입력: '))
     gcd = 0
    
     # 둘 중 작은 수만큼만 for문을 돌면 된다.
     for i in range(1, (num1 + 1)):
         if num1 % i == 0 and num2 % i == 0:
             gcd = i
     print('최대공약수: {}'.format(gcd))
    
     lcm = (num1 * num2) // gcd ⭐
     print('최소공배수: {}'.format(lcm))



🎫 진법

진법은 자릿수 체계로 표시하는 기수(Radix)의 종류와 그 기수의 위치(i)에 따라 결정된다.

기수(radix)는 수를 나타내는 데 기초가 되는 수로 진법 체계의 기준이 된다.
 ex> 2진수, 8진수, 10진수, 16진수, 등

❕ bin(), oct(), hex()

  • 10진수를 2(binary), 8(octal), 16(hexadecimal) 진법으로 변환

  • bin(), oct(), hex() 함수는 문자열 자료형으로 값을 반환한다.

    dNum = 30
    
    # 10진수 -> X진수
    print(' 2진수: {}'.format(bin(dNum)))  # 2진수: 0b11110
    print(' 8진수: {}'.format(oct(dNum)))  # 8진수: 0o36
    print('16진수: {}'.format(hex(dNum)))  #16진수: 0x1e    
    
    print('Type of bin(dNum): {}'.format(type(bin(dNum))))
    print('Type of oct(dNum): {}'.format(type(oct(dNum))))
    print('Type of oct(dNum): {}'.format(type(hex(dNum))))
    #Type of bin(dNum): <class 'str'>
    #Type of oct(dNum): <class 'str'>
    #Type of oct(dNum): <class 'str'>

❕ int()

  • 2, 8, 16진수를 10진수로 변환

    # X진수 -> 10진수
     print('2진수(0b11110) -> 10진수({})'.format(int(0b11110)))
     print('8진수(0o36) -> 10진수({})'.format(int(0o36)))
     print('16진수(0x1e) -> 10진수({})'.format(int(0x1e)))
  • 문자열로 데이터를 입력하는 경우 Radix를 명시해준다.

    print('2진수(0b11110) -> 10진수({})'.format(int('0b11110', 2)))
     print('8진수(0o36) -> 10진수({})'.format(int('0o36', 8)))
     print('16진수(0x1e) -> 10진수({})'.format(int('0x1e', 16)))
    
     # 2진수(0b11110) -> 10진수(30)
     # 8진수(0o36) -> 10진수(30)
     #16진수(0x1e) -> 10진수(30)

❕ format()

  • format() 함수는 형식문자(‘#b’ ‘#o’ ‘#x’)를 사용한다.

    # 10진수 -> X진수(format()함수 이용)
     print(' 2진수: {}'.format(format(dNum, '#b')))  #  2진수: 0b11110
     print(' 8진수: {}'.format(format(dNum, '#o')))  #  8진수: 0o36
     print('16진수: {}'.format(format(dNum, '#x')))  # 16진수: 0x1e 
  • format() 함수는 문자열 자료형으로 값을 반환한다.

    print('Type of bin(dNum): {}'.format(type(format(dNum, '#b'))))
     print('Type of oct(dNum): {}'.format(type(format(dNum, '#o'))))
     print('Type of oct(dNum): {}'.format(type(format(dNum, '#x'))))
     # Type of bin(dNum): <class 'str'>
     # Type of oct(dNum): <class 'str'>
     # Type of oct(dNum): <class 'str'>
  • 상징문자(0b, 0o, 0x) 없이 출력할 수 있다.

    print('2진수: {0:b}, 8진수: {0:o}, 16진수: {0:x}'.format(dNum))
     # 2진수: 11110, 8진수: 36, 16진수: 1e


profile
ISTP(정신승리), To Be Data Scientist

0개의 댓글