[데이터사이언스12기-스터디노트] 파이썬(23.02.12.)

도윤수·2023년 2월 12일
0

Python스터디노트

목록 보기
11/16
post-thumbnail

📝스터디노트 11일차 범위

기초수학 문제풀이(31약수와소수 ~ 35진법)

📖 약수와 소수
‣ 약수는 어떠한 수를 나누어 떨어지게 하는 수가 그 수의 약수이다.
‣ 소수는 어떠한 수가 약수를 1과 자기자신만을 가지고 있는 수가 소수이다.

# 100부터 1000사이의 난수에 대해 약수, 소수, 소인수 출력.
import random

rNum = random.randint(100, 1000)
print(f'rNum: {rNum}')

for num in range(1, rNum + 1):

    soinsooFlag = 0

    #약수
    if rNum % num == 0:
        print(f'[약수]: {num}')
        soinsooFlag += 1

    #소수
    if num != 1:
        flag = True
        for n in range(2, num):
            if num % n == 0:
                flag = False
                break

        if(flag):
            print(f'[소수]: {num}')
            soinsooFlag += 1

    #소인수
    if soinsooFlag >= 2:
        print(f'[소인수]: {num}')


1. 100~1000사이 난수에 대해 약수, 소수, 소인수를 출력했다.
2. 나눈 수의 나머지가 0이면 약수로 출력.
3. 1이 아닌 수 중 2부터 그 수까지 반복했을 때 나누어 떨어지면 소수, 그리고 flag를 False로 탈출.
4. 약수와 소수를 찾을때마다 소인수플래그에 추가하는데 두 군데 다 추가되면 소인수로 볼 수 있다.

📖 소인수와 소인수분해
‣ 소인수는 소수이면서 약수인 수 이다.
‣ 소인수분해는 어떠한 수를 소인수의 곱 형태로 나타내는 것이다.

# 100부터 1000사이의 난수를 소인수분해하고 소인수에 대한 지수를 출력한다.
import random

rNum = random.randint(100, 1000)
print(f'rNum: {rNum}')

soinsooList = []

n = 2
while n <= rNum:
    if rNum % n == 0:
        print(f'소인수: {n}')
        soinsooList.append(n)
        rNum /= n
    else:
        n += 1

print(f'soinsooList: {soinsooList}')

tempNum = 0
for s in soinsooList:
    if tempNum != s:
        print(f'{s}\'s count: {soinsooList.count(s)}')
        tempNum = s


1. 똑같이 random함수를 통해 난수를 출력할 것이고, 소인수리스트를 list 형식으로 선언한다.
2. 2부터 랜덤수까지 while로 반복하는데 나머지가 0인 수를 리스트에 append로 추가해주고 rNum / n 값을 rNum에 넣어준다. 나머지가 0이 아니라면 n을 증가시키며 반복한다.
3. 그렇게 추가 된 모든 소인수들을 리시트형태로 출력해준다.
4. 지수를 뽑아내기 위해 tempNum을 초기화 해주고,
5. 리스트에 있는 수를 count하는데 처음엔 다르니 체크해주고, 체크된 수를 tempNum에 담아준다.

📖 최대공약수
‣ 어떤 수를 나누었을 때 나머지가 0인 수가 약수이다.
‣ 그 약수들 중 가장 큰 수가 최대공약수이다.

# 100부터 1000사이의 난수들의 최대공약수를 구한다.
import random

rNum1 = random.randint(100, 1000)
rNum2 = random.randint(100, 1000)

print(f'rNum1: {rNum1}')
print(f'rNum2: {rNum2}')

maxNum = 0
for n in range(1, (min(rNum1, rNum2) + 1)): #min을 통해 둘 중 작은 수를 골라낸다.
    if rNum1 % n == 0 and rNum2 % n == 0:
        print(f'공약수: {n}')
        maxNum = n

print(f'최대공약수: {maxNum}')


1. 두 랜덤함수를 생성하는데, 공약수를 구하니 둘 중 작은 수 이상의 수는 구하는 의미가 없다.
2. min(a, b) 함수를 통해 둘 중 작은 함수가 선발되어 for문 범위를 정한다.
3. 만약 두 공약수가 1뿐이라면 두 수는 서로소 인것까지 출력해본다.

📖 최소공배수
‣ 어떤 수 들의 공통된 배수 중 가장 작은 수가 최소공배수이다.
‣ 두 수라면 (n1 * n2) / 최대공약수 로 구할 수 있다.

# 100부터 1000사이의 난수들의 최소공배수를 구한다.
import random

rNum1 = random.randint(100, 1000)
rNum2 = random.randint(100, 1000)

print(f'rNum1: {rNum1}')
print(f'rNum2: {rNum2}')

maxNum = 0
for n in range(1, (min(rNum1, rNum2) + 1)): #min을 통해 둘 중 작은 수를 골라낸다.
    if rNum1 % n == 0 and rNum2 % n == 0:
        print(f'공약수: {n}')
        maxNum = n

print(f'최대공약수: {maxNum}')

minNum = (rNum1 * rNum2) // maxNum
print('최소공배수: {}'.format(minNum))


1. 최대공약수를 구한 후, 두 수의 곱을 최대공약수로 나누어주면 최소공배수가 나온다.

📖 진법
‣ 흔히 2진법, 8진법, 10진법, 16진법을 사용한다.
‣ 어떠한 수를 나타내는 방법

# 여러가지 진법
dNum = int(input('10진수 입력: '))

print('2진수: {}'.format(bin(dNum)))
print('8진수: {}'.format(oct(dNum)))
print('16진수: {}'.format(hex(dNum)))

print('2진수(0b10101) -> 10진수({})'.format(int('0b10101', 2)))
print('8진수(0o25) -> 10진수({})'.format(int('0o25', 8)))
print('16진수(0x15) -> 10진수({})'.format(int('0x15', 16)))


1. 간단하게 입력 받은 수를 형태에 따라 캐스팅하듯이 출력해주면 변환된다.

★ 어려웠던 점(새로웠던 점) ★
1. 랜덤함수로 두 수를 받으면 어떤 수를 작은 수로 골라내나 생각했었는데 min함수를 통해 두 수를 비교하고 작은 수를 찾아낼 수 있었다.

2.진법을 바꿀 때 format에는 변환하고 싶은 수를 문자열로 쓰고 (변환 수, 진수) 콤마 뒤에 몇 진수인지를 써준다.
⇨ 2진수(bin), 8진수(oct), 16진수(oct), 10진수(int) 를 사용하면된다.

🔥🔥바쁜시간 쪼개서 매일매일 성장해 나가는 모습을 기록하자🔥🔥

profile
DataScience를 하고 싶은 DoIT

0개의 댓글