기초수학(9~13번)
ex)8P3
inputN =int(input('n 입력 : 8'))
inputR =int(input('r 입력 : 3'))
result = 1
for n in range(inputN, (inputN - inputR), -1):
result = result * n
print('n : {}'.format(n))
print('result : {}'.format(result))
출력값 :
n 입력 : 8
r 입력 : 3
n : 8
n : 7
n : 6
result : 336
원순열 : 시작과 끝이 구분이 없는 순열
n! / n or (n-1)!
<-> 순열과 반대( 순열은 순서 중요함.)
조합 : n개에서 r개를 선택하는 경우의 수
순열(nPr)의 공식 : n! / (n-r)!
조합(nCr)의 공식 : nPr / r!
ex)
numN = int(input('n 값 : 5'))
numR = int(input('r 값 : 2'))
resultP = 1
resultR = 1
resultC = 1
for n in range(numN, (numN - numR), -1):
print('n : {}'.format(n))
resultP = resultP * n
print('resultP 의 값 : {}'.format(resultP))
for n in range(numR, 0, -1):
print('n : {}'.format(n))
resultR = resultR * n
print('resultR 의 값 : {}'.format(resultR))
resultC = int(resultP / resultR)
print('resultC의 값 : {}'.format(resultC))
출력값 :
n 값 : 5
r 값 : 2
n : 5
n : 4
resultP 의 값 : 20
n : 2
n : 1
resultR 의 값 : 2
resultC의 값 : 10
- 확률 : 모든 사건에서 특정 사건이 일어날 수 있는 수를 나타낸 것.
ex) [동전]
모든사건 : 앞, 뒤 ->2가지 경우 ( 표본 공간)
특정사건 : 앞 -> 1가지 경우, 뒤 -> 1가지 경우 (사건)
확률 : 앞-> 1/2, 뒤 -> 1/2
ex)
import random *난수
rNum = random.randint(100, 1000)
print(f'rNum:{rNum}')
for num in range(1, rNum + 1 ):
soinsuFlag = 0
#약수
if rNum % num == 0:
print(f'[약수] : {num}')
soinsuFlag += 1
#소수
if num != 1:
flag = True
for n in range(2, num):
if num % n == 0:
flag = False
break
if(flag):
print(f'[소수] : {num}')
soinsuFlag += 1
#소인수
if soinsuFlag >= 2:
print(f'[소인수] : {num}')
ex) 소인수분해를 한 후 각각의 소인수에 대한 지수를 출력
import random
rNum = random.randint(100, 1000)
print(f'rnum : {rNum}')
soinsuList = []
n = 2
while 2 <= rNum:
if rNum % n == 0:
print(f'소인수 : {n}')
soinsuList.append(n)
rNum /= n
else:
n += 1
print(f'soinsulist : {soinsuList}')
tempNum = 0
for s in soinsuList:
if tempNum != s:
print(f'{s}\'s count : {soinsuList.count(s)}')
tempNum = s
출력값 :
rnum : 262
소인수 : 2
소인수 : 131
soinsulist : [2, 131]
2's count : 1
131's count : 1
ex)난수를 이용해 공약수와 최대공약수를 출력하자.
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)):
if rNum1 % n == 0 and rNum2 % n == 0:
print(f'공약수 : {n}')
maxNum = n
print(f'최대공약수 : {maxNum}')
if maxNum == 1:
print(f'{rNum1}과 {rNum2}는 서로소이다')
ex)최소공배수는 최대공약수를 구하면 쉽다.
최소공배수 = (정수 x 정수 ) // 최대공약수 : 나눈 몫이 최소공배수
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):
if rNum1 % n == 0 and rNum2 % n ==0:
print(f'공약수 : {n}')
maxNum = n
print(f'최대공약수 : {maxNum}')
minNum = (rNum1 * rNum2) // maxNum
print(f'최소공배수 : {minNum}')
#10진수 ->2,8,16 진수 변환
#x진수 ->10진수
x 진수 ->x진수
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진수(0o12312 -> 10진수({})'.format(int('0o12312', 8)))
print('16진수(0x19)-> 10진수{}'.format(int('0x19', 16)))
print('8진수(0o675) ->2진수({})'.format(bin(0o675)))
print('8진수(0o675) ->10진수({})'.format(int(0o675)))
print('8진수(0o675) ->16진수({})'.format(hex(0o675)))
print('16진수(0x45d) ->2진수({})'.format(bin(0x45d)))
print('16진수(0x45d) ->8진수({})'.format(oct(0x45d)))
print('16진수(0x45d) ->10진수({})'.format(int(0x45d)))
- 일반항 = a1 + (n - 1)*d
- 수열의 합 = n * (a1+an) / 2
num1 = int(input('a1 값 : '))
numD = int(input('공차 값 : '))
numN = int(input('n : '))
valueN = num1 + (numN - 1) numD
sumN = numN (num1 + valueN) / 2
print('{}번째 항의 값 : {}'.format(numN, valueN))
print('{}번째까지 항의 합 : {}'.format(numN, int(sumN)))
- 일반항 = a1 * r^(n-1)
- 수열의 합 = a1 * (1-r^n) / (1-r)
ex) 등비수열 공식을 이용한
numA1 = int(input('a1 항 : '))
numR = int(input('공비 : '))
numN = int(input('n : '))
valueN = numA1 numR ** (numN -1)
sumN = numA1 (1 - numR ** numN) / (1 - numR)
print('{}항의 값 : {}'.format(numN, valueN))
print('{}까지 항의 합 : {}'.format(numN, int(sumN)))
inputA1 = int(input('a1 입력 : '))
inputN = int(input('n 입력 : '))
valueN = ((3 inputN ** 2) - (3 inputN) + 4) / 2
print('an의 {}번째 항의 값 : {}'.format(inputN, int(valueN)))
- an = a(n-2) + a(n-1)
ex)
inputN = int(input('n 의 값 : '))
valueN = 0; sumN = 0
valueNPreN2 = 0
valueNPreN1 = 0
n = 1
while n <= inputN:
if n == 1 or n == 2:
valueN = 1
valueNPreN2 = valueN
valueNPreN1 = valueN
sumN += valueN
n += 1
else:
valueN = valueNPreN2 + valueNPreN1
valueNPreN2 = valueNPreN1
valueNPreN1 = valueN
sumN += valueN
n += 1
print('{}번째 항의 값 : {}'.format(inputN, valueN))
print('{}번째 항까지의 합 : {}'.format(inputN, sumN))
ex)재귀함수를 이용해서 팩토리얼 값을 출력
def facFun2(n):
if n == 1: *0이 되면 안되기 때문에 활용
return n
return n * facFun2(n-1)
num = int(input('input number : '))
print(f'{num}! : {facFun2(num)}')
ex)math 모듈을 이용한 팩토리얼 값 구하기.
import math
num = int(input('input number : '))
math.factorial(num)
print(f'{num}! : {math.factorial(num)}')
ex)수열의 합이 최초 100을 초과하는 n번째 항의 값과 n을 출력하는 프로그램 만들기.
flag= True
n = 1
nCnt = 1; searchNC = 0; searchNP = 0
sumN = 0
while flag:
for i in range(1, (n+1)):
print('{}/{} '.format(i, (n - i + 1)), end='')
sumN += i / (n - i + 1)
nCnt += 1
if sumN > 100:
searchNC = i
searchNP = n - i + 1
flag = False
break
print()
n += 1
일렬로 나열하는 경우의 수!
ex)
numN = int(input('n : ' ))
numR = int(input('r : ' ))
result = 1
for n in range(numN, numN - numR, -1):
print("n : {}".format(n))
result *= n
print('result : {}'.format(result))
순서상관없이 r개 선택하자
nCr = nPr / r!