약수 : 어떤 수를 나누어 떨어지게 하는 수
소수 : 1과 자기 자신만으로 나눠지는 수
소수의 반대말은 합성수이다.
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
소인수 : 소수이면서 인수(약수)인 수
소인수분해 : 1제외 소인수의 곱으로 나타낸것
# 소인수 찾아내기
inputNumber = 10
n = 2
while n <= inputNumber:
if inputNumber % n == 0:
print('소인수: {}'.format(n))
inputNumber /= n
else:
n += 1
두개 이상의 수에서 공통된 약수를 공약수라고 한다.
최대 공약수의 약수가 공약수이다.
# 최대 공약수 찾기
# 2개 동시에 나눴을때 둘다 나눠지는 최대의수
#num1 < num2
num1 = 12
num2 = 30
maxNum = 0
for i in range(1, num1+1):
if num1 % i == 0 and num2 % i ==0:
maxNum = i
print(maxNum)
공통된 배수에서 가장 작은수
두수의 곱을 두수의 최대공약수로 나누면 최소공배수가 된다.
3개의 수의 최소공배수를 구하려면, 먼저 두수의 최소공배수를 구하고, 나온 최소공배수와 나머지 남은 수의 최소공배수를 구한다. 그렇게 나온 것이 세 수의 최소공배수이다.
#num1 < num2
num1 = 12
num2 = 30
maxNum = 0
for i in range(1, num1+1):
if num1 % i == 0 and num2 % i ==0:
maxNum = i
minNum = num1 * num2 // maxNum # 두수의 곱을 최대공약수로 나누면 최소공배수가 나온다.
자리수를 구분하는 최소단위가 진수이다.
bin(), oct(), hex()# 10진수 -> X진수
print('2진수: {}'.format(bin(dNum)))
print('8진수: {}'.format(oct(dNum)))
print('16진수: {}'.format(hex(dNum)))
-> 10진수를 다양한 진수로 변환한 값은 모두 문자열이다.
다양한 진법 변환은 tip에 적어두고 필요할때 찾아보면서 익숙해질 것이다.
규칙성을 가지고 나열된 수들
일반항 - n번째 항을 문자로 표기한 것
연속된 두항의 차이(공차)가 일정한 수열
일반항

등차 중항
연속된 세항에서 가운데 항
수열의 합
규칙성을 이용해서 모든 항들의 총합을 구할 수 있다.
등차 중항을 이용하여 식을 단순화한다.
수열(합) 공식: sn = n(a1 + an) / 2


등차수열 코드
inputN1 = int(input('a1 입력: '))
inputD = int(input('공차 입력: '))
inputN = int(input('n 입력: '))
# 공식을 이용. 공식몰라도 충분히 추론 가능
valueN = inputN1 + (inputN-1) * inputD
print('{}번째 항의 값: {}'.format(inputN, valueN))
inputN1 = int(input('a1 입력: '))
inputD = int(input('공차 입력: '))
inputN = int(input('n 입력: '))
# 공식을 이용. 공식몰라도 충분히 추론 가능
valueN = inputN1 + (inputN-1) * inputD
sumN = inputN * (inputN1 + valueN) / 2
print('{}번째 항까지의 합: {}'.format(inputN, int(sumN)))
연속된 두 항의 비(공비)가 일정한 수열
등비 수열 규칙성을 이용해서 일반항을 구할 수 있다.
등비 수열(일반항) 공식: an = a1 * r^(n-1)

등비 중항
연속된 세항에서 가운데항
등비 수열의 합
등비 수열(일반항) 공식: an = a1 * r^(n-1)


등비수열 코드
inputN1 = int(input('a1 입력: '))
inputR = int(input('공비 입력: '))
inputN = int(input('n 입력: '))
# 공식을 이용. 공식몰라도 충분히 추론 가능
valueN = inputN1 * (inputR ** (inputN-1))
print('{}번째 항의 값: {}'.format(inputN, valueN))
inputN1 = int(input('a1 입력: '))
inputR = int(input('공비 입력: '))
inputN = int(input('n 입력: '))
# 공식을 이용. 공식몰라도 충분히 추론 가능
valueN = inputN1 * (inputR ** (inputN-1))
print('{}번째 항의 값: {}'.format(inputN, valueN))
수열의 합을 나타내는 기호
앞에서 등비수열/등차수열의 합을 표기함

어떤 수열의 인접하는 두 항의 차로 이워진 또 다른 수열

-> bn은 an의 계차수열이다.


세번째 항은 두번째 항과 첫번째 항을 더한 값이다.
while n <= inputN:
if n == 1 or n == 2:
valueN = 1
valuePreN2 = valueN
valuePreN1 = valueN
sumN += valueN
n += 1
else:
valueN = valuePreN2 + valuePreN1
valuePreN2 = valuePreN1 # 전전달에 전달 값주기
valuePreN1 = valueN # 전달에 이번달 값주기
sumN += valueN # 항들의 총합 구하기
n += 1
어떤 값(n)이 소수인지 판별하는 코드 핵심 아이디어는, 1과 값(n) 사이의 수의 나머지가 0인지 아닌지로 판단하넌 것이다. 그리고 for문 도중 소수인게 한번이라도 걸린다면, flag=False 로 주고 반복문을 나와서 소수인지 아닌지 판단하는 아이디어가 있다.
최대공약수 찾는 핵심 아이디어 num1 % i == 0 and num2 % i ==0과, for문에서 반복 범위(range안의값)가 두 수중 작은 수로 반복해야하는 당연한 사실을 잊지말자.
num1 = 12
num2 = 30
maxNum = 0
for i in range(1, num1+1): # range() 안에 둘 중 작은수(num1)가 들어가야함
if num1 % i == 0 and num2 % i ==0:
maxNum = i
print(maxNum)
최소공배수는 두 수의 곱을, 두 수의 최대공약수로 나눈 값을 알면 코드로 구현하기 매우 쉽다.
진법에서의 코드는 적어두고 필요할때 찾아보며 눈에 익혀두는 것이 좋을 것 같다.
등차수열과 등차수열의 합, 등비수열과 등비수열의 합에서, 첫번째 항을 따로 계산해줘야한다는 아이디어를 잊지말자. 또한 첫항에서도 while 문이기 때문에 n+=1을 해줘야한다.
등차수열b의 합은 n-1까지 합을 구해야하는 것을 주의하자.