기초수학 문제풀이(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) 를 사용하면된다.
🔥🔥바쁜시간 쪼개서 매일매일 성장해 나가는 모습을 기록하자🔥🔥