[기초수학] Chapter02. 기초수학 문제 풀이

황성미·2023년 7월 18일
0
post-thumbnail
post-custom-banner

✍🏻 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번째 항까지의 합을 구하는 프로그램을 완성해라
ana_n = {4, 10, 16, 22, 28, 34, ...}
bnb_n = {2, 6, 18, 54, 162, 486, ...}
💡등차수열, 등비수열 정리 내용 링크
1. ana_n 구하기

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}')

  1. bnb_n 구하기
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번째 항의 값을 출력하는 프로그램을 완성해라
ana_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을 출력하는 프로그램을 완성해라
ana_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%

profile
데이터 분석가(가 되고픈) 황성미입니다!
post-custom-banner

2개의 댓글

comment-user-thumbnail
2023년 7월 18일

유익한 글 잘 봤습니다, 감사합니다.

1개의 답글