[기초수학] 공약수_공배수_소인수분해_진법_수열

·2023년 3월 15일
0

[기초 수학]

목록 보기
1/3
post-thumbnail

✏️약수와 소수

  • 약수 : 어떤 수를 나누어떨어지게 하는 수
  • 소수 : 1과 자신만을 약수로 가지는 수

✏️소인수와 소인수분해

  • 소인수 : 약수 중에서 소수인 숫자
  • 소인수분해 : 1보다 큰 정수를 소인수의 곱으로 나타낸 것

✍️실습

소인수분해


def primeFactor(num):
    i = 2
    while i <= num:
        if num % i == 0:
            print(f'소인수 : {i}')
            #
            # if num == i:
            #     break
            num = num // i

        else:
            i += 1

num = int(input('1보다 큰 정수 입력 : '))
primeFactor(num)

거듭제곱을 만드는 가장 작은 정수

def minSquareFactor(num):
    factors = []
    i = 2
    while i <= num:
        if num % i == 0:
            print(f'소인수 : {i}')
            if i in factors:
                factors.pop()
            else:
                factors.append(i)
            num = num // i
        else:
            i += 1

    return factors[0]


num = int(input('1보다 큰 정수 입력 : '))
print(f'가장 작은 정수 : {minSquareFactor(num)}')

✏️공약수와 최대공약수

  • 공약수 : 두 개 이상의 수에서 공통된 약수
  • 최대공약수 : 공약수 중 가장 큰 수

소인수분해를 이용하면 최대공약수 및 공약수를 구할 수 있다.

  • 최대공약수 : 공통인 소인수의 거듭제곱에서 지수가 작은 수를 모두 곱한다.

✍️실습

for문과 유클리드 호제법을 이용한 최대공약수 구하기


def maxCommonDivisor(n1, n2):
    maxDivisor = 0
    for i in range(1, n1 + 1):
        if n1 % i == 0 and n2 % i == 0:
            print(f'공약수 : {i}')
            maxDivisor = i

    return maxDivisor

'''
# 유클리드 호제법 
    n1 % n2 = v1
    n2 % v1 = v2
    v1 % v2 = v3
    v2 % v3 = 0 #최대공약수는 v3
    
 
'''


def euclidean(n1, n2):  # 내가 생각한 방식
    while True:

        if n1 % n2 == 0:
            return n2
        else:
            # print(f'{n2} % {n1 % n2} = {n2 % (n1 % n2)} ')
            return euclidean(n2, n1 % n2)


def euclidean2(n1, n2):
    temp1 = n1
    temp2 = n2

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

    return temp1


n1 = int(input('1보다 큰 정수 입력 : '))
n2 = int(input('1보다 큰 정수 입력 : '))
maxCommonDivisor(n1, n2)
print(euclidean2(n1, n2))

✏️공배수와 최소공배수

  • 공배수와 : 두 개 이상의 수에서 공통된 배수
  • 최소공배수 : 공배수 중 가장 작은 수

소인수분해를 이용하면 최소공배수 및 공배수를 구할 수 있다.

  • 최소공배수 : 공통인 소인수의 거듭제곱에서 지수가 크고 공통이 아닌수를 모두 곱한다.

✍️실습

최소공배수 : (n1 * n2) / 최대공약수


def minMultiple(n1, n2):
    max = 0
    for i in range(1, n1 + 1):
        if n1 % i == 0 and n2 % i == 0:
            print(f'공약수 : {i}')
            max = i

    # 최소공배수 =  (n1 * n2) // 최대공약수
    print(f'최소공배수 : {(n1 * n2 // max)}')


def tripleMultiple(n1, n2, n3):
    maxDiv = 0
    minMul1 = 0
    minMul2 = 0

    # n1과 n2의 최소공배수 구하기
    for i in range(1, n1 + 1):
        if n1 % i == 0 and n2 % i == 0:
            maxDiv = i

    minMul1 = n1 * n2 // maxDiv
    print(f'{n1}, {n2}의 최소공배수 : {minMul1}')

    # n3과 (n1,n2)의 최소공배수 구하기
    for i in range(1, n3 + 1):
        if n3 % i == 0 and minMul1 % i == 0:
            maxDiv = i
            

    minMul2 = n3 * minMul1 // maxDiv
    print(f'{n3}, {minMul1}의 최소공배수 : {minMul2}')

    return minMul2


n1 = int(input('1보다 큰 정수 입력 : '))
n2 = int(input('1보다 큰 정수 입력 : '))
n3 = int(input('1보다 큰 정수 입력 : '))

minMultiple(n1, n2)
tripleMultiple(n1, n2, n3) 

✏️진법

convert Binary, Octal, Hexadecimal and Decimal numbers.


print(f'2진수 : {bin(30)}')
print(f'2진수 : {format(30, "b")}')
print(f'8진수 : {oct(30)}')
print(f'8진수 : {format(30, "o")}')
print(f'16진수 : {hex(30)}')
print(f'16진수 : {format(30, "x")}')

# x진수->10진수
b = bin(30)
print(f'{bin(30)} -> {format(int(bin(30), 2))}')
print(f'{oct(30)} -> {format(int(oct(30), 8))}')
print(f'{hex(30)} -> {format(int(hex(30), 16))}')


💡result

2진수 : 0b11110
2진수 : 11110
8진수 : 0o36
8진수 : 36
16진수 : 0x1e
16진수 : 1e
0b11110 -> 30
0o36 -> 30
0x1e -> 30

✏️수열

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

등차 수열

https://www.calculatored.com

✍️실습

등차 수열


def arith_sequence(a1, n, d):
    for i in range(1, n + 1):
        val = a1 + (i - 1) * d
        print(f'{i}번쟤 항의 값 : {val}')


a1 = int(input('a1 입력 : '))
n = int(input('n 입력 : '))
d = int(input('공차 : '))
arith_sequence(a1, n, d)

등차 수열의 합

# 등차 수열의 합

def sumArithSequence(a1, n, d):
    last = a1 + (n - 1) * d
    sum = (a1 + last) * n / 2
    print(f'{n}번째 항까지의 값 : {sum}')


a1 = int(input('a1 입력 : '))
n = int(input('n 입력 : '))
d = int(input('공차 : '))
sumArithSequence(a1, n, d)

등비 수열

https://www.calculatored.com

https://www.calculatored.com

✍️실습

등비 수열

# 등비 수열
def geoSequence(a1, n, r):
    val = a1 * (r ** (n - 1))
    print(f'{n}항의 값 : {val}')

a1 = int(input('a1 입력 : '))
n = int(input('n 입력 : '))
r = int(input('공비 : '))

geoSequence(a1, n, r)

등비 수열의 합

# 등비 수열이 합 
def sumGeoSequence(a1, n, r):
    last = (a1 * (1 - (r ** n))) / (1 - r)
    print(f'{n}번째 항까지의 값 : {last} ')


a1 = int(input('a1 입력 : '))
n = int(input('n 입력 : '))
r = int(input('공비 : '))

sumGeoSequence(a1, n, r)
profile
개발하고싶은사람

0개의 댓글