[2주차] 기초수학 1~3

이철민·2023년 2월 8일
0
  • 중급 문제풀이를 하다보니, 기본적인 수학 내용을 다 까먹어 너무 고생을 해, 기초수학을 먼저 공부하고 중급 문제풀이로 가기로 했다!

[약수와 소수]

  • 약수: 어떤 수를 나누어떨어지게 하는 수
  • 소수: 1과 자신만을 약수로 가지는 수 (단, 1은 제외)
## 약수 구하기!

inputNumber = int(input('0보다 큰 정수 입력: '))

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

## 소수 구하기!

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))
  • 소인수: 약수 중에서 소수인 숫자
  • 소인수분해: 1보다 큰 정수를 소인수의 곱으로 나타낸 것
    • ex. 36 = 2^ * 3^
# 입력한 정수의 소인수 구하기

inputNumber = int(input('1보다 큰 정수 입력: '))
n = 2
while n <= inputNumber:
    if inputNumber % n == 0:
        print('소인수: {}'.format(n))
        inputNumber /= n
    else:
        n += 1
        
 ---------------------------------------------
        
 ## 72에 x를 곱하면 y의 제곱이 된다 할때, x에 해당하는 가장 작은 정수 구하기
 
inputNumber = int(input('1보다 큰 정수 입력: '))

n = 2
searchNumbers = []

while n <= inputNumber:
    if inputNumber % n == 0:
        print('소인수: {}'.format(n))
        if searchNumbers.count(n) == 0:     # list.count(n)  해당 리스트에 n이 몇개 있는지 반환
            searchNumbers.append(n)
        elif searchNumbers.count(n) == 1:   # 리스트에 하나라도 있으면, x를 구하는 데 있어서는 무시해도 되기 때문에 지워버리는 것.
            searchNumbers.remove(n)
        inputNumber /= n

    else:
        n += 1

print('searchNumbers: {}'.format(searchNumbers))
  • 공약수: 두 개 이상의 수에서 공통된 약수
    • 최대 공약수: 공약수 중에서 가장 큰 수
      -> 공통인 소인수의 거듭제곱에서 지수가 작은 수를 모두 곱한다.
# for문과 유클리드 호제법을 이용해 최대공약수를 구하자

# 유클리드 호제법: x,y의 최대공약수는 y,r(x%y)의 최대공약수와 같다.    (r은 x를 y로 나눴을때의 나머지)

# 반복문

num2가 num1보다 크다는 전제
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))

# 반복문이 다 끝나고 나서 maxNum을 출력하면 두 수의 가장 큰 공약수가 남기 때문에 최대공약수가 구해지는 것!

# 유클리드 호제법

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, te

[최소공배수]

  • 공배수: 두 개 이상의 수에서 공통된 배수
  • 최소공배수: 공배수 중 가장 작은 수
    • 공통인 소인수의 거듭제곱에서 지수가 크고 공통 아닌 수를 모두 곱한다.
# 3, 4, 5의 최소공배수

ship1 = 3; ship2 = 4; ship3 = 5
maxDay = 0

for i in range(1,(ship1+1)):
    if ship1 % i == 0 and ship2 % i ==0:
        maxDay = i

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

minDay = (ship1 * ship2) // maxDay
print('{}, {}의 최소 공배수: {}'.format(ship1, ship2, minDay))


newDay = minDay

for i in range(1,(newDay+1)):
    if newDay % i == 0 and ship3 % i ==0:
        maxDay = i

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

minDay = (newDay * ship3) // maxDay
print('{}, {}, {}의 최소 공배수: {}'.format(ship1, ship2, ship3, minDay))

[진법]

  • 진법: 특정 숫자 몇 개를 사용하여 수를 표시하는 방법
    • 진수는 모두 문자열이다.

8진수는 0 1 2 3 4 5 6 7 8 9 A B C D E 활용

 파이썬을 이용한 진법 변환

# 10진수 -> 2진수, 8진수, 16진수

# 2진수: binary -> bin()
# 8진수: octal -> oct()
# 16진수: hexadecimal -> hex()

# 10진수를 2진수로 변경하는 방법
dNum = 30
print('2진수: {}'.format((bin(dNum)))

#  다른 방법
dNum = 30
print('2진수: {}'.format(format(dNum, '#b')))
print('8진수: {}'.format(format(dNum, '#o')))
print('16진수: {}'.format(format(dNum, '#x')))

# 또 다른 방법
dNum = 30
print('{0:#b}, {0:#o}, {0:#x}'.format(dNum, dNum, dNum))

# 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)))
profile
늘 온 마음을 다해 :)

0개의 댓글