스터디노트(기초수학 문제풀이 1~3)

zoe·2023년 3월 16일
0

💡 [연습문제] 약수와 소수

💡 100부터 1000사이의 난수에 대해서 약수, 소수, 그리고 소인수를 출력하는 프로그램을 생성
약수: 나누어 떨어지는 수
소수: 1외에 약수가 자기 자신뿐인 수
소인수: 약수(인수)이면서 소수인 수

# import random
# 
# randomNumber = random.randint(100, 1000)
# print('난수 : {}' .format(randomNumber))
# 
# num = 1
# num1 = []
# num2 = []
# num3 = []
# 
# for i in range(1, randomNumber+1):
#     flag = True
#     if randomNumber % i == 0:
#         num1.append(i)
#     if i > 1:
#         for j in range(2, i): # ★
#             if i % j == 0:
#                 flag = False
#                 break
#         if flag:
#             num2.append(i)
#     if flag and randomNumber % i == 0 :
#         num3.append(i)
# print('약수 : {}' .format(num1))
# print('소수 : {}' .format(num2))
# print('소인수 : {}' .format(num3))


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

💡 [연습문제] 소인수와 소인수분해

💡 100부터 1000사이의 난수를 소인수분해를 하고 각각의 소인수에 대한 지수를 출력하는 프로그램을 생성

# 100부터 1000사이의 난수를 소인수분해를 하고 각각의 소인수에 대한 지수를 출력하는 프로그램을 생성

import random

randomNumber = random.randint(100, 1000)
print('난수 : {}' .format(randomNumber))

soinList=[] # ★
n = 2 # ★
while n <= randomNumber:
    if randomNumber % n == 0:
        print(f'소인수 : {n}')
        soinList.append(n)
        randomNumber /= n
    else:
        n += 1
print(f'soinList : {soinList}')

tempNum = 0
for i in soinList:
    if tempNum != i:
        print(f'{i}\'s count : {soinList.count(i)}') # ★★★
        tempNum = i

💡 [연습문제] 최대공약수

  • min(n1,n2...) : 입력한 숫자들 중 작은 값을 반환

💡 100부터 1000사이의 2개의 난수에 대해서 공약수와 최대공약수를 출력하고, 서로소인지 출력하는 프로그램을 생성

# 100부터 1000사이의 2개의 난수에 대해서 공약수와 최대공약수를 출력하고,
# 서로소인지 출력하는 프로그램을 생성

# import random
#
# randomNumber1 = random.randint(100, 1000)
# randomNumber2 = random.randint(100, 1000)
# print(f'2개의 난수 : {randomNumber1},{randomNumber2}')
#
# max_commonDivisor = 0
# commonDivisor = []
#
# if randomNumber1 > randomNumber2:
#     tempNum = randomNumber2
# else:
#     tempNum = randomNumber1
#
# for i in range(1, tempNum):
#     if randomNumber1 % i == 0 and randomNumber2 % i == 0:
#         print(f'공약수 : {i}')
#         commonDivisor.append(i)
#         max_commonDivisor = i
#
# print(f'공약수 : {commonDivisor}')
# print(f'최대 공약수 : {max_commonDivisor}')


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)): # min(n1,n2) : 입력한 숫자들 중 작은 값을 반환
    if rNum1 % n == 0 and rNum2 % n == 0:
        print(f'공약수 : {n}')
        maxNum = n
print(f'최대공약수 : {maxNum}')

💡 [연습문제] 최소공배수

💡 100부터 1000사이의 2개의 난수에 대해서 최대공약수와 최소공배수를 출력하는 프로그램을 생성

# 100부터 1000사이의 2개의 난수에 대해서 최대공약수와 최소공배수를 출력하는 프로그램을 생성

# import random
#
# randomNumber1 = random.randint(100, 1000)
# randomNumber2 = random.randint(100, 1000)
# print(f'2개의 난수 : {randomNumber1},{randomNumber2}')
#
# greatestCommonDivisor = 0
# for i in range(1, min(randomNumber1, randomNumber2)+1):
#     if randomNumber1 % i == 0 and randomNumber2 % i ==0:
#         print(f'최대공약수 : {i}')
#         greatestCommonDivisor = i
#
# leastCommonMultiple = int((randomNumber1 * randomNumber2) // greatestCommonDivisor)
# print(f'최소공약수 : {leastCommonMultiple}')



import random

rNum1 = random.randint(100, 1000)
rNum2 = random.randint(100, 1000)
print(f'2개의 난수 : {rNum1},{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}')

[연습문제] 진법

사용자가 입력한 수를 이용해서, 다음 내용에 따라 진법 변환하는 코드를 작성

# 사용자가 입력한 수를 이용해서, 다음 내용에 따라 진법 변환하는 코드를 작성

inputNum = int(input('숫자 입력 : '))

print(f'2진수 : {format(bin(inputNum))}')
print(f'8진수 : {format(oct(inputNum))}')
print(f'16진수 : {format(hex(inputNum))}')

# inputNum = int(input('숫자 입력 : '))
#
# inputNum = format(inputNum,8)
print('2진수(0b1011) -> 10진수({})'.format(format(int('0b1011',2))))
print('8진수(0o13) -> 10진수({})'.format(format(int('0o13',8))))
print('16진수(0xb) -> 10진수({})'.format(format(int('0xb',16))))

print('2진수(0b1011) -> 10진수({})'.format(format(int(0b1011))))
print('8진수(0o13) -> 16진수({})'.format(format(hex(0o13))))
print('16진수(0xb) -> 2진수({})'.format(format(bin(0xb))))

print('16진수(0xb) -> 8진수({})'.format(format(oct(0xb))))

💡 [연습문제] 등차수열

*- 등차수열의 일반항 : a1 + (n-1) d

  • 등차수열의 합 : = n(a1 + an) / 2**

💡 다음 수열의 일반항을 구하고 n번째항의 값과 합을 구하는 프로그램을 만들어보자.
{4, 10, 16, 22, 28, 34, 40, 46, 52, 58, 64… }


# 다음 수열의 일반항을 구하고 n번째항의 값과 합을 구하는 프로그램을 만들어보자.
# {4, 10, 16, 22, 28, 34, 40, 46, 52, 58, 64… }

# inputA1 = int(input('a1 입력 : '))
# inputD = int(input('공차 입력 : '))
# inputN = int(input('n 입력 : '))
#
# valueN = 0; sumN = 0
# n = 1
#
# while n <= inputN:
#     if n == 1:
#         valueN = inputA1
#         sumN += valueN
#         print(f'{n}번째 항의 값 : {valueN}')
#         print(f'{n}번째 항의 합 : {sumN}')
#         n += 1
#         continue
#     valueN += inputD
#     sumN += valueN
#     print(f'{n}번째 항의 값 : {valueN}')
#     print(f'{n}번째 항의 합 : {sumN}')
#     n += 1
# print()
# print(f'{inputN}번째 항의 값 : {valueN}')
# print(f'{inputN}번째 항의 합 : {sumN}')




# 일반항 : a1 + (n-1) * d
# 등차수열의 합 : = n(a1 + an) / 2

inputA1 = int(input('a1 입력 : '))
inputD = int(input('공차 입력 : '))
inputN = int(input('n 입력 : '))

valueN = inputA1 + (inputN - 1) * inputD
print(f'{inputN}번째 항의 값 : {valueN}')
sumN = inputN*(inputA1 + valueN) / 2
print(f'{inputN}번째 항의 합 : {sumN}')

💡 [연습문제] 등비수열

  • 등비수열의 일반항 : an = a1 * r^(n-1)
  • 등비수열의 합 : sn = a1 * (1 - r^n) / (1-r)

💡 다음 수열의 일반항을 구하고 n번째항의 값과 합을 구하는 프로그램을 만들어보자.
{2, 6, 18, 54, 162, 486, 1458, 4374, 13122, … }

#다음 수열의 일반항을 구하고 n번째항의 값과 합을 구하는 프로그램을 만들어보자.
#{2, 6, 18, 54, 162, 486, 1458, 4374, 13122, … }

# inputA1 = int(input('a1 입력 : '))
# inputD = int(input('공비 입력 : '))
# inputN = int(input('n 입력 : '))
#
# valueN = 1; sumN = 0
# n = 1
#
# while n <= inputN:
#     if n == 1:
#         valueN *= inputA1
#         sumN += valueN
#         print(f'{n}번째 항의 값 : {valueN}')
#         print(f'{n}번째 항의 합 : {sumN}')
#         n += 1
#         continue
#     valueN *= inputD
#     sumN += valueN
#     print(f'{n}번째 항의 값 : {valueN}')
#     print(f'{n}번째 항의 합 : {sumN}')
#     n += 1
#
# print()
# print(f'{inputN}번째 항의 값 : {valueN}')
# print(f'{inputN}번째 항의 합 : {sumN}')



# 등비수열의 일반항 : an = a1 * r^(n-1)
# 등비수열의 합 : sn = a1 * (1 - r^n) / (1-r)

inputA1 = int(input('a1 입력 : '))
inputD = int(input('공비 입력 : '))
inputN = int(input('n 입력 : '))

valueN = inputA1 * inputD ** (inputN - 1)
sumN = (inputA1 * (1 - inputD**inputN)) / (1 - inputD)

print(f'{inputN}번째 항의 값 : {valueN}')
print(f'{inputN}번째 항의 합 : {sumN}')

💡 [연습문제] 시그마

💡 첫 째날 쌀 두톨을 받고 둘째 날부터는 하루 전의 2배에 해당하는 쌀을 받는다고 할 때, 30일째 되는 날 받게 되는 쌀의 개수를 수열과 시그마로 나타내고 이를 출력하는 프로그램을 생성

# 첫 째날 쌀 두톨을 받고 둘째 날부터는 하루 전의 2배에 해당하는 쌀을 받는다고
# 할 때, 30일째 되는 날 받게 되는 쌀의 개수를 수열과 시그마로 나타내고 이를 출력하는 프로그램을 생성

# {2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, … }

# 등비수열
# inputA1 = int(input('a1 입력 : '))
# inputR = int(input('공비 입력 : '))
# inputN = int(input('n 입력 : '))
#
# valueN = 0; sumN = 0
# n = 1
#
# while n <= inputN:
#     if n == 1:
#         valueN = inputA1
#         sumN += valueN
#         print(f'{n}번째 항의 합 : {format(sumN,",")}')
#         n += 1
#         continue
#     valueN *= inputR
#     sumN += valueN
#     print(f'{n}번째 항의 합 : {format(sumN,",")}')
#     n += 1
# print(f'{inputN}번째 항의 합 : {format(sumN,",")}')



# 등비수열의 일반항 : an = a1 * r^(n-1)
# 등비수열의 합 : sn = a1 * (1 - r^n) / (1-r)

inputA1 = int(input('a1 입력 : '))
inputR = int(input('공비 입력 : '))
inputN = int(input('n 입력 : '))

valueN = inputA1 * inputR*(inputN-1)
sumN = (inputA1*(1-inputR**inputN)) / (1-inputR)
print(f'{inputN}번째 항의 합 : {format(sumN,",")}')

💡 [연습문제] 계차수열

💡 다음 수열의 일반항을 구하고, n항의 값을 출력하는 프로그램 생성
{2, 5, 11, 20, 32, 47, 65, 86, 110, 137, 167, …}

# 다음 수열의 일반항을 구하고, n항의 값을 출력하는 프로그램 생성
# {2, 5, 11, 20, 32, 47, 65, 86, 110, 137, 167, …}

# an = (3n^2 - 2n + 4) / 2

inputAN1 = int(input('a1 입력 : '))
inputAN = int(input('an 입력 : '))

valueN = ((3 * inputAN ** 2) - 2 * inputAN + 4) / 2
print('an의 {}번째 항의 값 : {}' .format(inputAN, int(valueN)))

💡 [연습문제] 피보나치 수열

💡 피보나치수열에서 n항의 값과 n항까지의 합을 출력하는 프로그램을 생성
{1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, …}

# 피보나치수열에서 n항의 값과 n항까지의 합을 출력하는 프로그램을 생성
# {1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, …}

inputN = int(input('n 입력 : '))

sumN = 0

valueReN1 = 0
valueReN2 = 0

n = 1
while n <= inputN:
    if n == 1 or n == 2:
        valueN = 1
        valueReN1 = valueN
        valueReN2 = valueN
        sumN  += valueN
        n += 1
        continue
    valueN = valueReN1 + valueReN2
    valueReN1 = valueReN2
    valueReN2 = valueN
    sumN += valueN
    n += 1
print('{} 항의 값 : {}, {} 항까지의 합 : {}' .format(inputN, valueReN2, inputN, sumN))

팩토리얼

팩토리얼 프로그램을 만들되, 반복문을 이용한 함수와 재귀 함수를 이용해서 구현해보고 또한, 파이썬에서 제공하는 모듈도 사용해 보기

# 팩토리얼 프로그램을 만들되, 반복문을 이용한 함수와 재귀 함수를 이용해서
# 구현해보고 또한, 파이썬에서 제공하는 모듈도 사용해 보기

def factorialFun(n):

    fac = 1
    for i in range(n, 0, -1): # 1~n까지 ★
        fac *= i
    return fac

num = int(input('input number : '))
print(f'{num}! : {factorialFun(num)}')


def factorialFun2(n):
    if n == 1:
        return n
    return n * factorialFun2(n-1)
num = int(input('input number : '))
print(f'{num}! : {factorialFun2(num)}')


import math

num = int(input('input number : '))
print(f'{num}! : {math.factorial(num)}')

💡 군수열

💡 다음 수열을 보고 수열의 합이 최초 100을 초과하는 n번째 항의 값과 n을 출력하는 프로그램을 생성

# 다음 수열을 보고 수열의 합이 최초 100을 초과하는 n번째 항의 값과 n을 출력하는 프로그램을 생성

flag = True
sumN = 0
n = 1 # 군을 의미
nCnt = 1 # 항을 의미
searchNC = 0 # 분자
searchNP = 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
print('수열의 합이 최초 100을 초과하는 항, 값, 합 : {}, {}/{}, {}' .format(nCnt, searchNC, searchNP, round(sumN,2)))

순열

파이썬을 이용해서 다음 순열들의 값을 구하는 프로그램을 생성

# 파이썬을 이용해서 다음 순열들의 값을 구하는 프로그램을 생성
# 9P4, 6P2

numN = int(input('numN 입력 : '))
numR = int(input('numR 입력 : '))
result = 1

for i in range(numN, (numN - numR), -1):
    print(f'n : {i}')
    result *= i

print(f'result : {result}')

💡 카드 7장을 일렬로 나열하되 2, 4, 7번 카드가 서로 이웃하도록 나열하는 모든 경우의 수를 구하는 프로그램을 생성

# 카드 7장을 일렬로 나열하되 2, 4, 7번 카드가 서로 이웃하도록 나열하는 모든 경우의 수를 구하는 프로그램을 생성
# 5!(카드 위치) * 3! (2, 4, 7번 카드의 위치)

fNum1 = int(input('factorial : '))
result1 = 1
fNum2 = int(input('factorial : '))
result2 = 1

for n in range(fNum1,0,-1):
    result1 *= n
print('result1 : {}' .format(result1))

for n in range(fNum2,0,-1):
    result2 *= n
print('result1 : {}' .format(result2))

print('모든 경우의 수 : {}' .format(result1*result2))

조합

파이썬을 이용해서 다음 조합들의 값을 구하는 프로그램을 생성
9C4, 6C2

# 파이썬을 이용해서 다음 조합들의 값을 구하는 프로그램을 생성
# 9C4, 6C2

numN = int(input('numN 입력 : '))
numR = int(input('numR 입력 : '))

resultN = 1
resultR = 1
resultC = 0

for i in range(numN, numN - numR, -1):
    print('n : {}' .format(i))
    resultN *= i
print('resultN : {}' .format(resultN))

for i in range(numR, 0, -1):
    print('r : {}' .format(i))
    resultR *= i
print('resultR : {}' .format(resultR))

resultC = int(resultN / resultR)
print('{}C{} : {}' .format(numN, numR, resultC))

💡 카드 7장 중 3장을 선택했을 때 3, 4, 5가 동시에 선택될 수 있는 확률

# 카드 7장 중 3장을 선택했을 때 3, 4, 5가 동시에 선택될 수 있는 확률


numN = int(input('numN 입력 : '))
numR = int(input('numR 입력 : '))

resultP = 1
resultR = 1
resultC = 0

for i in range(numN, numN - numR, -1):
    resultP *= i
    print(f'n : {i}')
print('resultP : {}' .format(resultP))

for i in range(numR, 0, -1):
    resultR *= i
    print(f'n : {i}')
print('resultR : {}' .format(resultR))

resultC = int(resultP / resultR)
print('resultC : {}' .format(resultC))
print('확률 : {}' .format(round(1/resultC*100,2))) # ★★★

💡 확률

💡 박스에 ‘꽝’이 적힌 종이가 6장 있고, ‘선물’이 적힌 종이가 4장이 있을 때, 파이썬을 이용해서 ‘꽝’3장과 ‘선물’ 3장을 뽑는 확률(%)을 출력

# 박스에 ‘꽝’이 적힌 종이가 6장 있고, ‘선물’이 적힌 종이가 4장이 있을 때,
# 파이썬을 이용해서 ‘꽝’3장과 ‘선물’ 3장을 뽑는 확률(%)을 출력
# 6C3*4C3 / 10C6

def proFun():
    numN = int(input('numN 입력 : '))
    numR = int(input('numR 입력 : '))

    resultP = 1
    resultR = 1
    resultC = 1

    # 순열(P)
    for i in range(numN, numN - numR,-1):
        resultP *= i
    print('resultP : {}' .format(resultP))

    # R(P)
    for i in range(numR, 0, -1):
        resultR *= i
    print('resultR : {}' .format(resultR))

    # 조합(C)
    resultC = int(resultP / resultR)
    print('resultC : {}' .format(resultC))
    return resultC


sample = proFun()
print('sample : {}' .format(sample))

event1 = proFun()
print('sample : {}' .format(event1))

event2 = proFun()
print('sample : {}' .format(event2))

probablity = (event1 * event2) / sample
print('probablilty : {}' .format(round(probablity * 100,2))) # ★

💻 출처 : 제로베이스 데이터 취업 스쿨

profile
#데이터분석 #퍼포먼스마케팅 #데이터 #디지털마케팅

0개의 댓글