코딩하는 타코야끼

[스터디 노트] Week2_5일차 [unit1 ~ 14] - 기초수학 본문

zero-base 데이터 취업 스쿨/스터디 노트

[스터디 노트] Week2_5일차 [unit1 ~ 14] - 기초수학

가스오부시 2023. 7. 19. 05:52
728x90
반응형

1. 기초수학_1~2 [unit 1 ~ 9]


📍 약수

  • 어떤 수를 나누어떨어지게 하는 수
# 파이썬을 이용해서 사용자가 입력한 숫자의 약수를 출력해보자.
num = int(input("0보다 큰 정수 입력: "))

for i in range(1, num+1):
    if num % i == 0:
        print(f"{num}의 약수: {i}")
>>>
0보다 큰 정수 입력: 30
30의 약수: 1
30의 약수: 2
30의 약수: 3
30의 약수: 5
30의 약수: 6
30의 약수: 10
30의 약수: 15
30의 약수: 30

📍 소수

  • 1과 자신만약수로 가지는 수(단, 1은 제외)
# 파이썬을 이용해서 사용자가 입력한 숫자까지의 소수를 출력해보자.
u_num = int(input("0보다 큰 정수 입력: "))

prime = []
for prime_num in range(2, u_num+1):
    is_prime = True
    
    for num in range(2, int(prime_num ** 0.5) + 1):
        if prime_num % num == 0:
            is_prime = False 
            break
            
    if is_prime:
        prime.append(prime_num)
        
print(prime)
>>>
0보다 큰 정수 입력: 50
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]

📍 소인수

  • 약수(인수) 중에서 소수인 숫자소인수라고 한다.

📍 소인수분해

  • 1보다 큰 정수를 소인수의 곱으로 나타낸 것을 소인수분해라고 한다.

📍 소인수분해와 약수

  • 소인수분해를 이용해서 약수를 정확하고 쉽게 구할 수 있다.
# 72에 x를 곱하면 y의 제곱이 된다고 할 때, x에 해당하는 가장 작은 정수를 구하자.
input_num = int(input("1보다 큰 정수 입력: "))

n = 2
l = [ ]
while n <= input_num:
    if input_num % n == 0:
        print(f"소인수: {n}")
        
        if l.count(n) == 0:
            l.append(n)
            
        elif l.count(n) == 1:
            l.remove(n)
        
        input_num /= n
        
    else:
        n += 1
        
print(f"찾는 숫자: {l}")
>>>
1보다 큰 정수 입력: 72
소인수: 2
소인수: 2
소인수: 2
소인수: 3
소인수: 3

📍 공약수

  • 두 개 이상의 수에서 공통된 약수공약수라고 한다.

📍최대공약수

  • 공약수 중 가장 큰 수를 최대공약수라고 한다.
  • 소인수분해를 이용하면 최대공약수 및 공약수를 구할 수 있다.
  • 소수로 나눗셈을 하면 좀 더 편리하게 최대공약수를 구할 수 있다.
# 두 개의 수를 입력하면 공약수와 최대공약수를 출력하는 코드를 작성하자.

num1 = int(input("숫자1 입력: "))
num2 = int(input("숫자2 입력: "))
max_num = 0

for i in range(1, num1+1):
    if num1 % i == 0 and num2 % i == 0:
        max_num = i
print(f"최대공약수는: {max_num}")
>>>
숫자1 입력: 6
숫자2 입력: 5
최대공약수는: 1

⚡️ 유클리드 호제법

  • 유클리드 호제법을 이용해서 최대공약수를 구할 수 있다
  • x, y의 최대공약수는   y, r(x%y)  의 최대공약수와 같다.
num1 = int(input("숫자1 입력: "))
num2 = int(input("숫자2 입력: "))

temp1 = num1; temp2 = num2

while temp2 > 0:
    temp = temp2
    temp2 = temp1 % temp2
    temp1 = temp
    
print(f"{num1}, {num2}의 최대공약수: {temp1}")
>>>
숫자1 입력: 12
숫자2 입력: 36
12, 36의 최대공약수: 12

📍 공배수

  • 두 개 이상의 수에서 공통된 배수를 공배수라고 한다.

📍 최소공배수

  • 공배수 중 가장 작은 수를 최소공배수라고 한다.
  • 소인수분해를 이용하면 최소공배수 및 공배수를 구할 수 있다.
  • 소수로 나눗셈을 하면 좀 더 편리하게 최소공배수를 구할 수 있다.
  • 두 숫자를 곱한 값에 최대공약수를 나눈 몫이 최소공배수 이다.
# 두 개의 수를 입력하면 최소공배수를 출력하는 코드를 작성하자.

num1 = int(input("숫자1 입력: "))
num2 = int(input("숫자2 입력: "))
max_num = 0

for i in range(1, num1 + 1):
    if num1 % i == 0 and num2 % i == 0:
        max_num = i
        
min_num = (num1 * num2) // max_num

print(f"최소공배수: {min_num}")
>>>
숫자1 입력: 10
숫자2 입력: 12
최소공배수: 60

2. 기초수학_3 [unit 10 ~ 13]


📍 진법

  • 진법이란, 특정 숫자 몇 개를 사용하여 수를 표시하는 방법이다.

[출처: zero-base]


📍 진법 변환 함수

  •  bin( )  - 2진수 변환
  •  oct( )  - 8진수 변환
  •  int( )  - 10진수 변환
  •  hex( )  - 16진수 변환

📎 변환 결과는 문자열이다

num = 10
print(f"type of bin(num): {type(bin(num))}")
print(f"type of bin(num): {type(oct(num))}")
print(f"type of bin(num): {type(hex(num))}")
>>>
type of bin(num): <class 'str'>
type of bin(num): <class 'str'>
type of bin(num): <class 'str'>

📎  2진수, 8진수, 16진수(format()함수 이용)

print("2진수: {}".format(format(num, "#b")))
print("8진수: {}".format(format(num, "#o")))
print("10진수: {}".format(format(num, "#x")))
>>>
2진수: 0b1010
8진수: 0o12
10진수: 0xa

📎 x진수 -> 10진수

print("2진수(0b11110) -> 10진수({})".format(int('0b11110', 2)))
print("2진수(0b11110) -> 10진수({})".format(int(0b11110))) # 이 방법을 더 선호함.
>>>
2진수(0b11110) -> 10진수(30)
2진수(0b11110) -> 10진수(30)

📍 수열

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

📍 항들의 합과 항의 관계

  • 특정항은 특정항까지의 합에서 특정항 이전의 항까지의 합과 같다.

📍 등차 수열

  • 연속된 두 항의 차이가 일정한 수열
  • 수열에서 각 항은 그 이전 항에 일정한 차이(공차)를 더함으로써 얻어집니다.
  • 예를 들어, 2, 4, 6, 8, 10은 공차가 2인 등차수열입니다.
    • 이 경우 n번째 항은 첫 번째 항에 (n-1) * 2 공차를 더한 값으로 구할 수 있습니다.

# 다음 수열을 보고 n번째 항의 값을 출력하는 프로그램을 만들어보자.
# an = {2, 5, 8, 11, 14, 17, 20, 23, 26, 29, ... }

num1 = int(input("a1입력: "))
dis = int(input("공차 입력: "))
num2 = int(input("n입력: "))

value_n = 0
n = 1
while n <= num2:
    
    if n == 1:
        value_n = num1
        n += 1
        continue
    
    value_n += dis
    n += 1
    
print(f"{num2}번째 항의 값: {value_n}")
>>>
a1입력: 2
공차 입력: 3
n입력: 7
7번째 항의 값: 20
# # a(n) = a(1) + (n-1) * d

num1 = int(input("a1입력: "))
dis = int(input("공차 입력: "))
num2 = int(input("n입력: "))

result = num1 + (num2 - 1) * dis
print(result)
>>>
a1입력: 2
공차 입력: 3
n입력: 7
20

📍 등차 중항

  • 연속된 세 항에서 가운데 항


📍 등차 수열의 합

  • 규칙성을 이용해서 모든 항들의 총합을 구할 수 있다.

# 다음 수열을 보고 n번째 항까지의 합을 출력하는 프로그램을 만들어보자.
num1 = int(input("a1입력: "))
dis = int(input("공차 입력: "))
num2 = int(input("n입력: "))

value_n = 0
sum_n = 0
n = 1
while n <= num2:
    
    if n == 1:
        value_n = num1
        sum_n = value_n
        n += 1
        continue
    
    value_n += dis
    sum_n += value_n
    n += 1
    
print(f"{num2}번째 항의 값: {value_n}")
print(f"{num2}번째 까지 항 값의 합: {sum_n}")
>>>
a1입력: 5
공차 입력: 4
n입력: 7
7번째 항의 값: 29
7번째 까지 항 값의 합: 119
# n( a(1) + a(n) ) / 2
# a(n) = a(1) + (n-1) * d

num1 = int(input("a1입력: "))
dis = int(input("공차 입력: "))
num2 = int(input("n입력: "))

result = (num1 * 2 + (num2 - 1) * dis) * num2 / 2 
print(int(result))
>>>
a1입력: 5
공차 입력: 4
n입력: 7
119

 

반응형