- 어떤 수를 나누어 떨어지게 하는 수
- 1과 자신만을 약수로 가지는 수 (1 제외)
(실습) 1부터 30까지의 숫자 중 5로 나눈 몫과 나머지가 모두 소수인 숫자들을 찾아보자
1) 몫으로 나올 수 있는 소수를 찾는다
2, 3, 5
2) 5 x 몫에 5보다 작은 소수를 더한다
2 x 5 + 2, 2 x 5 + 3
3 x 5 + 2, 3 x 5 + 3
5 x 5 + 2, 5 x 5 + 3
3) 결과
12, 13, 17, 18, 27, 28
(실습) 1부터 30까지의 숫자 중 소수를 찾아보자
1) 2를 제외한 2의 배수 제거
2) 3를 제외한 3의 배수 제거
3) 5를 제외한 5의 배수 제거
4) 7를 제외한 7의 배수 제거
5) 11을 제외한 11의 배수 제거
6) 13을 제외한 11의 배수 제거
7) 결과
2, 3, 5, 7, 11, 13, 17, 19, 23, 29
inputNumber = int(input('0보다 큰 정수 입력: '))
for number in range(1, (inputNumber + 1)): if inputNumber % number == 0: print('{}의 약수: {}'.format(inputNumber, number))
inputNumber = int(input('0보다 큰 정수 입력: '))
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보다 큰 정수를 소인수의 곱으로 나타낸 것을 소인수분해라고 한다
- 소인수분해를 이용해서 약수를 정확하고 쉽게 구할 수 있다
inputNumber = int(input('1보다 큰 정수 입력: '))
n = 2 while n <= inputNumber: if inputNumber % n == 0: print('소인수: {}'.format(n)) inputNumber /= n else: n += 1
inputNumber = int(input('1보다 큰 정수 입력: '))
n = 2 searchNumbers = [] while n <= inputNumber: if inputNumber % n == 0: print('소인수: {}'.format(n)) if searchNumbers.count(n) == 0: searchNumbers.append(n) elif searchNumbers.count(n) == 1: searchNumbers.remove(n) inputNumber /= n else: n += 1
print('searchNumbers: {}'.format(searchNumbers))
- 두 개 이상의 수에서 공통된 약수를 공약수라고 한다
- 공약수 중 가장 큰 수를 최대 공약수라고 한다
- 공통인 소인수의 거듭제곱에서 지수가 작은 수를 모두 곱한다
ex) 12 = 2^2 x 3, 20 = 2^2 x 5 -> 최대공약수 : 2^2 = 4, 공약수 : 4의 약수 (1, 2, 4)- 좀 더 편리하게 최대공약수 구하는 방법(소수로 나눗셈)
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))
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, temp1))
- 소인수분해를 이용하면 최소공배수 및 공배수를 구할 수 있다
1) 공통인 소인수의 거듭제곱에서 지수가 크고 공통아닌 수를 모두 곱한다
ex) 4 = 2^2 , 12 = 2^2 x 3 -> 2^2 x 3 = 12
2) 공배수 = 최소 공배수의 배수
ex) 12, 24, 36, ...
- 좀 더 편리하게 최소공배수 구하는
방법
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)) minNum = (num1 * num2) // maxNum print('최소공배수: {}'.format(minNum))
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))
진법이란, 특정 숫자 몇 개를 사용하여 수를 표시하는 방법이다
10진수 -> 2진수
10진수 -> 8진수
10진수 -> 16진수
2진수 -> 10진수
8진수 -> 10진수
2진수 -> 8진수
2진수 -> 16진수
(변환 결과는 문자열)
dNum = 30
[10진수 -> X진수]
print('2진수: {}'.format(bin(dNum))) print('8진수: {}'.format(oct(dNum))) print('16진수: {}'.format(hex(dNum)))
[10진수 -> X진수(format()함수 이용)]
print('2진수: {}'.format(format(dNum, '#b'))) print('8진수: {}'.format(format(dNum, '#o'))) print('16진수: {}'.format(format(dNum, '#x'))) print('2진수: {0:#b}, 8진수: {0:#o}, 16진수: {0:#x}'.format(dNum))
print('2진수(0b11110) -> 10진수({})'.format(int('0b11110', 2))) print('8진수(0o36) -> 10진수({})'.format(int('0o36', 8))) print('16진수(0x1e) -> 10진수({})'.format(int('0x1e', 16)))
print('2진수(0b11110) -> 8진수({})'.format(oct(0b11110))) print('2진수(0b11110) -> 10진수({})'.format(int(0b11110))) print('2진수(0b11110) -> 16진수({})'.format(hex(0b11110)))
print('8진수(0o36) -> 2진수({})'.format(bin(0o36))) print('8진수(0o36) -> 10진수({})'.format(int(0o36))) print('8진수(0o36) -> 16진수({})'.format(hex(0o36)))
print('16진수(0x1e) -> 2진수({})'.format(bin(0x1e))) print('16진수(0x1e) -> 8진수({})'.format(oct(0x1e))) print('16진수(0x1e) -> 10진수({})'.format(int(0x1e)))
반복문 사용
inputN1 = int(input('a1 입력: ')) inputD = int(input('공차 입력: ')) inputN = int(input('n 입력: '))
valueN = 0 n = 1
while n <= inputN: if n == 1: valueN = inputN1 print('{}번째 항의 값: {}'.format(n, valueN)) n += 1 continue valueN += inputD print('{}번째 항의 값: {}'.format(n, valueN)) n += 1 print('{}번째 항의 값: {}'.format(inputN, valueN))
등차 수열(일반항) 공식: an = a1 + (n-1) * d
inputN1 = int(input('a1 입력: ')) inputD = int(input('공차 입력: ')) inputN = int(input('n 입력: '))
valueN = 0
valueN = inputN1 + (inputN-1) * inputD print('{}번째 항의 값: {}'.format(inputN, valueN))
반복문 사용
inputN1 = int(input('a1 입력: ')) inputD = int(input('공차 입력: ')) inputN = int(input('n 입력: '))
valueN = 0 sumN = 0 n = 1
while n <= inputN: if n == 1: valueN = inputN1 sumN += valueN print('{}번째 항까지의 합: {}'.format(n, sumN)) n += 1 continue valueN += inputD sumN += valueN print('{}번째 항까지의 합: {}'.format(n, sumN)) n += 1 print('{}번째 항까지의 합: {}'.format(inputN, sumN))
등차 수열(합) 공식: sn = n(a1 + an) / 2
inputN1 = int(input('a1 입력: ')) inputD = int(input('공차 입력: ')) inputN = int(input('n 입력: '))
valueN = 0 sumN = 0 n = 1
valueN = inputN1 + (inputN-1) * inputD sumN = inputN * (inputN1 + valueN) / 2 print('{}번째 항까지의 합: {}'.format(inputN, int(sumN)))
반복문 사용
inputN1 = int(input('a1 입력: ')) inputR = int(input('공비 입력: ')) inputN = int(input('n 입력: '))
valueN = 0 n = 1
while n <= inputN: if n == 1: valueN = inputN1 print('{}번째 항의 값: {}'.format(n, valueN)) n += 1 continue valueN *= inputR print('{}번째 항의 값: {}'.format(n, valueN)) n += 1 print('{}번째 항의 값: {}'.format(inputN, valueN))
등비 수열(일반항) 공식: an = a1 * r^(n-1)
inputN1 = int(input('a1 입력: ')) inputR = int(input('공차 입력: ')) inputN = int(input('n 입력: '))
valueN = 0
valueN = inputN1 * (inputR ** (inputN-1)) print('{}번째 항의 값: {}'.format(inputN, valueN))
반복문 사용
inputN1 = int(input('a1 입력: ')) inputR = int(input('공비 입력: ')) inputN = int(input('n 입력: '))
valueN = 0 sumN = 0 n = 1
while n <= inputN: if n == 1: valueN = inputN1 sumN += valueN print('{}번째 항까지의 합: {}'.format(n, sumN)) n += 1 continue valueN *= inputR sumN += valueN print('{}번째 항까지의 합: {}'.format(n, sumN)) n += 1 print('{}번째 항까지의 합: {}'.format(inputN, sumN))
등비 수열(합) 공식: sn = a1 * (1 - r^n) / (1-r)
inputN1 = int(input('a1 입력: ')) inputR = int(input('공비 입력: ')) inputN = int(input('n 입력: '))
valueN = 0 sumN = 0 n = 1
sumN = inputN1 * (1 - (inputR ** inputN)) / (1 - inputR) print('{}번째 항까지의 합: {}'.format(inputN, int(sumN)))
an = {3, 7, 13, 21, 31, 43, 57}
4 6 8 10 12 14
반복문 사용
inputAN1 = int(input('a1 입력: ')) inputAN = int(input('an 입력: ')) inputBN1 = int(input('b1 입력: ')) inputBD = int(input('bn 공차 입력: '))
valueAN = 0 valueBN = 0 n = 1
while n <= inputAN: if n == 1: valueAN = inputAN1 valueBN = inputBN1 print('an의 {}번째 항의 값: {}'.format(n, valueAN)) print('bn의 {}번째 항의 값: {}'.format(n, valueBN)) n += 1 continue valueAN += valueBN valueBN += inputBD print('an의 {}번째 항의 값: {}'.format(n, valueAN)) print('bn의 {}번째 항의 값: {}'.format(n, valueBN)) n += 1 print('an의 {}번째 항의 값: {}'.format(inputAN, valueAN)) print('bn의 {}번째 항의 값: {}'.format(inputAN, valueBN))
n^2 + n + 1 = an
inputAN1 = int(input('a1 입력: ')) inputAN = int(input('an 입력: '))
valueAN = inputAN ** 2 + inputAN + 1 print('an의 {}번째 항의 값: {}'.format(inputAN, valueAN))
오랜만에 중고등학교때 배웠던 수학들을 보니 기억이 새록새록 다시 나면서 파이썬에 대입해 수학을 배우니 훨씬 기억에도 잘 남았고 재미있었다
복습으로 한 파이썬 중급 문제풀이 마무리 부분은 진짜 지옥이었다
너무 어려웠고 역시나 한번보고 이해가는 문제는 손에 꼽을정도였다
파이썬 중급 문제풀이 부분은 계속 다른 공부 하면서 병행을 하던지, 다시 되돌아가서 여러번 공부해야겠다
그렇지 않고서는 머리에 잘 안남겠다고 확신했다 ㅋㅋ.. 내일은 기초 수학 다음부분을 공부 할 예정이다