✍🏻 18일 공부 이야기.
지난시간에 배운 약수, 소수, 소인수, 최대공약수, 최소공배수, 등차수열, 등비수열, 계차수열, 군수열, 순열, 조합, 확률 문제를 풀어보았다:)
100과 1000 사이의 난수를 발생하고 그 수의 약수, 소수, 소인수를 출력하는 프로그램을 완성해라
💡약수, 소수, 소인수 정리 내용 링크
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
#소수 : 1을 제외한 수 중 1과 자신만을 약수로 가지는 수
if num != 1:
flag = True
for n in range(2, num):
if num % n == 0:
flag = False
break
if flag == True:
print(f'[소수] : {num}')
soinsuFlag += 1
#소인수 : 약수 중에서 소수인 숫자
if soinsuFlag >= 2:
print(f'[소인수] : {num}')
100부터 1000사이의 난수를 소인수분해하고 각각의 소인수에 대한 지수를 출력하는 프로그램을 완성해라
💡소인수 정리 내용 링크
import random
rNum = random.randint(100,1000)
print(f'rNum : {rNum}')
soinsuList = []
n = 2
#소인수 찾기
while n <= 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 : 416
[소인수] : 2
[소인수] : 2
[소인수] : 2
[소인수] : 2
[소인수] : 2
[소인수] : 13
[soinsuList] : [2, 2, 2, 2, 2, 13]
2's count : 5
13's count : 1
100부터 1000사이의 2개의 난수에 대해 공약수와 최대공약수 , 최소공배수를 출력하고 서로소인지 출력하는 프로그램을 완성해라
💡 공약수, 최대공약수, 최소공배수 정리 내용 링크
import random
rNum1 = random.randint(100,1000)
rNum2 = random.randint(100,1000)
print(f'rNum1 : {rNum1}')
print(f'rNum2 : {rNum2}')
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}')
#서로소 : 두 수 의 공약수가 1뿐인 수
if maxNum == 1:
print(f'{rNum1}과 {rNum2}는 서로소이다.')
#최소공배수
minNum = (rNum1 * rNum2) // maxNum
print(f'[최소공배수] : {minNum}')
💻 출력
rNum1 : 942
rNum2 : 804
[공약수] : 1
[공약수] : 2
[공약수] : 3
[공약수] : 6
[최대공약수] : 6
[최소공배수] : 126228
다음 두 수열의 일반항을 구하고 n번째 항의 값과 n번째 항까지의 합을 구하는 프로그램을 완성해라
= {4, 10, 16, 22, 28, 34, ...}
= {2, 6, 18, 54, 162, 486, ...}
💡등차수열, 등비수열 정리 내용 링크
1. 구하기
inputa1 = int(input('a1 입력 : '))
inputD = int(input('공차 입력 : '))
inputN = int(input("n 입력 : "))
an = 0
sumN = 0
n = 1
while n <= inputN:
if n == 1:
an = inputa1
sumN += an
print(f'{n}번째 항의 값 : {an}')
print(f'{n}번째 항까지의 합 : {sumN}')
n += 1
continue
an += inputD
sumN += an
print(f'{n}번째 항의 값 : {an}')
print(f'{n}번째 항까지의 합 : {sumN}')
n += 1
print(f'{inputN}번째 항의 값 : {an}')
print(f'{inputN}번째 항까지의 합 : {sumN}')
inputb1 = int(input('b1 입력 : '))
inputR = int(input('공비 입력 : '))
inputN = int(input("n 입력 : "))
bn = 0
sumN = 0
n = 1
while n <= inputN:
if n == 1:
bn = inputb1
sumN += bn
print(f'{n}번째 항의 값 : {bn}')
print(f"{n}번째 항까지의 합 : {sumN}")
n += 1
continue
bn *= inputR
sumN += bn
print(f'{n}번째 항의 값 : {bn}')
print(f"{n}번째 항까지의 합 : {sumN}")
n += 1
print(f'{inputN}번째 항의 값 : {bn}')
print(f"{n}번째 항까지의 합 : {sumN}")
등차수열, 등비수열의 일반항과 합 공식을 이용해서 문제를 풀 수도 있다!
다음 수열의 일반항을 구하고 n번째 항의 값을 출력하는 프로그램을 완성해라
= {2, 5, 11, 20, 32, 47, ...}
💡 계차수열 내용 정리 링크
inputAN1 = int(input("a1 입력 : "))
inputAN = int(input("n 입력 : "))
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(f'an의 {n}번째 항의 값 : {valueAN}')
print(f'bn의 {n}번째 항의 값 : {valueBN}')
n += 1
continue
valueAN += valueBN
valueBN += inputBD
print(f'an의 {n}번째 항의 값 : {valueAN}')
print(f'bn의 {n}번째 항의 값 : {valueBN}')
n += 1
print(f'an의 {inputAN}번째 항의 값 : {valueAN}')
print(f'bn의 {inputAN}번째 항의 값 : {valueBN}')
💻 출력
a1 입력 : 2
n 입력 : 7
b1 입력 : 3
bn 공차 입력 : 3
an의 1번째 항의 값 : 2
bn의 1번째 항의 값 : 3
an의 2번째 항의 값 : 5
bn의 2번째 항의 값 : 6
an의 3번째 항의 값 : 11
bn의 3번째 항의 값 : 9
an의 4번째 항의 값 : 20
bn의 4번째 항의 값 : 12
an의 5번째 항의 값 : 32
bn의 5번째 항의 값 : 15
an의 6번째 항의 값 : 47
bn의 6번째 항의 값 : 18
an의 7번째 항의 값 : 65
bn의 7번째 항의 값 : 21
an의 7번째 항의 값 : 65
bn의 7번째 항의 값 : 21
다음 수열을 보고 수열의 합이 최초 100을 초과하는 n번째 항의 값과 n을 출력하는 프로그램을 완성해라
= {1/1, 1/2, 2/1, 1/3, 2/2, 3/1, 1/4, 2/3, 3/2, 4/1, ...}
💡 군수열 정리 내용 링크
flag = True
n = 1
nCnt = 1
searchNC = 0 #분자
searchNP = 0 #분모
sumN = 0
while flag:
for i in range(1, n+1):
print(f'{i}/{(n - i + 1)} ',end = '')
nCnt += 1
sumN += i / (n - i + 1)
if sumN > 100 :
searchNC = i
searchNP = n - i + 1
flag = False
break
print()
n += 1
print(f"{nCnt}항 : {searchNC}/{searchNP} ")
print(f"{nCnt}항까지의 합 : {sumN} ")
print(f"합이 100을 초과하는 n : {nCnt}")
💻 출력
1/1
1/2 2/1
1/3 2/2 3/1
1/4 2/3 3/2 4/1
1/5 2/4 3/3 4/2 5/1
1/6 2/5 3/4 4/3 5/2 6/1
1/7 2/6 3/5 4/4 5/3 6/2 7/1
1/8 2/7 3/6 4/5 5/4 6/3 7/2 8/1
1/9 2/8 3/7 4/6 5/5 6/4 7/3 8/2 9/1
1/10 2/9 3/8 4/7 5/6 6/5 7/4 8/3 9/2 10/1
56항 : 10/1
56항까지의 합 : 105.81190476190476
합이 100을 초과하는 n : 56
1, 2, 3, 4, 5, 6, 7 순서로 나열되어있는 7장의 카드가 있다. 카드 7장을 일렬로 나열하되, 2, 4, 7번 카드가 서로 이웃하도록 나열하는 모든 경우의 수를 구하는 프로그램을 완성해라.
💡 순열 내용 정리 링크
#2,4,7을 하나의 카드로 생각하고
#1, (2,4,7), 3, 5, 6 총 5개의 카드를 나열하는 경우의 수를 구하고
#2,4,7 카드를 나열하는 경우의 수를 곱해주자.
fNum1 = int(input("factorial1 : "))
result1 = 1
for n in range(fNum1, 0, -1):
result1 *= n
print(f"result1 : {result1}")
fNum2 = int(input("factorial2 : "))
result2 = 1
for n in range(fNum2, 0, -1):
result2 *= n
print(f"result2 : {result2}")
print(f'모든 경우의 수 : {result1 * result2}')
💻 출력
factorial1 : 5
result1 : 120
factorial2 : 3
result2 : 6
모든 경우의 수 : 720
1, 2, 3, 4, 5, 6, 7 이 적혀진 7장의 카드 중 3장을 선택했을 때, 3, 4, 5 가 동시에 선택될 수 있는 확률을 구하는 프로그램을 완성해라
💡 조합 , 확률 내용 정리 링크
#그 3장의 카드가 3, 4, 5 인 경우의 수 : 1
# /
#전체 7장의 카드 중 순서 상관없이
#3장의 카드를 뽑는 경우의 수
numN = int(input('numN 입력 : '))
numR = int(input('numR 입력 : '))
resultP = 1
resultR = 1
resultC = 1
#3장의 카드를 뽑는 경우의 수
for n in range(numN, numN - numR , -1):
resultP *= n
print(f"resultP : {resultP}")
for n in range(numR, 0, -1):
resultR *= n
print(f'resultR : {resultR}')
resultC = int(resultP / resultR)
print(f'resultC : {resultC}')
result = round((1/resultC) * 100 , 2)
print(f'{result}%')
💻 출력
numN 입력 : 7
numR 입력 : 3
resultP : 210
resultR : 6
resultC : 35
2.86%
유익한 글 잘 봤습니다, 감사합니다.