[데이터사이언스12기-스터디노트] 파이썬(23.02.09.)

도윤수·2023년 2월 9일
0

Python스터디노트

목록 보기
8/16
post-thumbnail

📝스터디노트 8일차 범위

기초 수학 1, 2(약수와 소수)

📖 약수와 소수

‣ 약수는 어떠한 수를 나누어 떨어지게 하는 수가 그 수의 약수이다.
‣ 소수는 어떠한 수가 약수를 1과 자기자신만을 가지고 있는 수가 소수이다.

약수를 먼저 보면, 예를 들어 15의 약수를 구하라.
15는 2로 나누어 떨어지지 않으므로 2는 15의 약수가 아니다.
3으로 나눌 수 있고 몫은 5이면 3과 5는 15의 약수이다.

# 약수와 소수, 1은 제외
inputNumber = int(input("0보다 큰 정수 입력: "))

for number in range(1, (inputNumber + 1)):  # 1부터 사용자가 입력한 수까지.
    if inputNumber % number == 0:
        print('{}의 약수'.format((inputNumber, number)))


0 보다 큰 정수를 입력받아 약수를 구해주는 코드이다.
1. 입력값으로 0보다 큰 정수(int)를 입력 받고,
2. for문으로 반복해서 (1부터, 내가 입력한수)까지 반복을 해준다.
⇨ 파이썬은 0부터 시작하기 때문에 입력값보다 1작은 수까지 반복되므로 +1해준다.
3. 입력값을 반복문에 들어가는 수로 나누었을 때 나머지가 0으로 나누어 떨어지면 그 수는 약수이다.

소수의 경우를 보면, 예를 들어 똑같이 15는 소수인가?
15는 앞서 본것처럼 약수(1,3,5,15)가 존재하기 때문에 소수가 아니다.
1부터 15까지의 소수를 찾으면 약수가 1과 자기자신만을 갖는[3,5,7,11,13]이 있다.

# 1부터 입력한 숫자까지의 소수를 출력한다.
inputNumber = int(input('0보다 큰 정수 입력: '))

for number in range(2, inputNumber + 1):  # 1은 소수가 아니라 2부터 시작, 사용자가 입력한 숫자까지라 +1 해준다.
    flag = True # 반복을 위해 flag

    for n in range(2, number):  # 위 for에서 나온 item을 반복 -> 시작 숫자부터 n 바로 직전 숫자까지 반복.
        # ex 1~5까지면 2,3,4 가 있는데 5라는 숫자를 2, 3, 4로 나눠봐서 0이면 소수, 소수가 아닌 합성수라 False가 되면서 끝.
        if number % n == 0: # 약수가 아니게 되므로
            flag = False    # False를 준다.
            break

    if flag:
        print('{} : 소수!!'.format(number))   # 1과 본인자신만을 약수로 갖는 수
    else:
        print('{} : \t\t 합성수!!'.format(number))  # 소수와 반대

# 마지막 if, else가 백탭해서 들어가면 10만 출력된다.


1은 소수가 아니기 때문에 2부터 시작한다.
1. 똑같이 입력 값(int)을 받고,
2. for문으로 2부터 입력 값까지 반복하는데 True flag를 넣어준다.
3. for문 안에 for문을 넣고 위에서 선언한 item을 반복하는데 시작 숫자부터 입력 값 바로 전까지 반복이다.
⇨ ex 입력 값이 5일 때 밖 for문의 범위가 1~5까지면 안 for문에선 2,3,4 가 있는데 5라는 숫자를 2, 3, 4로 나눠봐서 0이면 소수, 소수가 아닌 합성수라 flag가 False가 되면서 끝.
4. 그렇게 결과 값이 소수 이거나 소수가 아닌 합성수가 나온다.

소수란 어떤 것이냐 하는 것은 학교에서 배웠던 부분이라 다들 알겠지만 구현하는데 있어 어려움이 있을 순 있다.
소수를 구하는 방법 중 유명한 <테라토스테네스의 체> 라는 알고리즘이 있다.
위에 구현한 것 처럼 입력 값마다 대입하면서 구해내는 것이 아니라, 입력 값까지의 범위 중 약수, 약수의 배수들을 제거해 나가는 방식이다.

만약 소수를 구하고자 하는 범위가 크다면 테라토스테네스의 체 알고리즘이 훨씬 빠르고 효율적으로 구할 수 있을 것 같다.

★ 어려웠던 점 ★
1. 소수를 구할 때 for문 안에 for문이 들어갔던 부분.
⇨ 설명을 들으면서 작성은 했지만, 정확하게 이해가 가지않아 아직 혼자 작성한다면 떠오르는 방법이 아닌듯하다.

  1. 바깥쪽 for문과 같은 라인에 마지막 출력단이 놓였을 때 입력 값에 대한 결과만 출력이 됐었다.
    안쪽 for문과 같은 라인에 출력단을 놓으니 원하는 결과로 구하고자 했던 범위의 수 전체가 출력이 되는데 안쪽 for문을 거치면서 출력을 뽑아줬어야 원하는 결과를 보는건데 거치지 않고 바깥 쪽 for문만 출력해서 그런 것 같다.

🔥🔥바쁜시간 쪼개서 매일매일 성장해 나가는 모습을 기록하자🔥🔥

profile
DataScience를 하고 싶은 DoIT

0개의 댓글