본문 바로가기
프로그래밍/파이썬기초

소수 판별(emirp소수, 쌍둥이소수, 6촌 소수)_파이썬 기초

by 조크리 2021. 3. 31.
반응형

 

파이썬 찐초보 (이번글은 그냥 초보로 업그레이드 ㅎㅎ)

 

소수판별하기

 

오늘의 목표

1. 소수인지, 아닌지 판별하는 함수 만들기

2. emirp소수 판별 함수 만들기

3. 쌍둥이 소수 판별 함수 만들기

4. 6촌 소수 판별 함수 만들기 

 

 

 

 

1. 소수인지, 아닌지 판별하는 함수를 만들어보자!

 

소수란? 1보다 큰 정수 1과 자기 자신으로만 나누어지는 수'를 말한다.

영어로는 Prime Number라고 부른다.

1은 1보다 큰 정수가 아니라서 소수가 아니고

2는 1보다 큰 정수이고 1과2이외의 자연수로 나눌 수 없으므로 소수이다. (2는 항상 소수이다!)

4는 1보다 큰 정수이지만 1과 4 이외에도 2로 나눌 수 있기 때문에 소수가 아니다.

 

자, 그럼 사용자가 입력한 값이 소수인지 아닌지 판별하는 함수를 만들어보자! 

소수인지, 아닌지 판별하는 방법은 사용자가 입력한 값 % 

 

사용자가 10을 입력했다면 x의 range는 3 ~ 10까지의 숫자이다. 

그럼 3 % 2를 해서 나머지가 0이라면 조건문을 끝낸다. 

그렇지 않고 primeData 리스트의 맨 마지막 값인 [-1]를 찾아서 2와 비교를 했을 때 그 값이 같으면

primData리스트에 그 값을 추가한다. 

 

그럼 코드로 나타내보자. 

기본적으로 함수를 활용하지 않는다면 아래의 코드에서 def prime(number)만 빼고 그 안에 있는 내용을 쓰면 된다.

아래의 코드는 그냥 소수를 판별하는 코드를 함수 안으로 넣은 것 뿐이다. 

함수를 호출할 때는 맨 마지막에 prime(number)처럼 호출해주면 된다!

def prime(number):
  primeData=[2]
  for x in range(3,number+1):
    for i in primeData:
      if (x%i == 0): 
        break
      elif(i==primeData[-1]):
        primeData.append(x) 
        break

  if(x in primeData):
    print ("%d는 소수입니다"%(number))
  else:
    print ("%d는 소수가 아닙니다"%(number))

  
number=int(input("숫자를 입력하세요: "))
prime(number)

 

이번에는 함수 안에서 값을 return하도록 만들어보자. 

아래의 코드를 보면 가운데 쯤 isPrime이라는 변수가 보이는데 이 변수에 prime()함수를 넣었다.

즉, isPrime은 prime(number)로 사용자가 입력받은 값을 넣은 함수 값을 의미한다. 

 

만약 primeData에 포함되어 있다면 1을 리턴하고 포함되어 있지 않다면 0을 리턴한다. 

 

def prime(number):
  primeData=[2]
  for x in range(3,number+1):
    for i in primeData:
      if (x%i == 0):
        break
      elif(i==primeData[-1]):
        primeData.append(x)
        break
  if(x in primeData): 
    return 1
  else: 
    return 0

number=int(input("숫자 : "))
isPrime=prime(number)

if(isPrime):
  print ("%d는 소수입니다"%(number))
else:
  print ("%d는 소수가 아닙니다"%(number))

 

 

2. emipr 소수인지 판별해보자. 

 

emirp 소수의 판별법을 알아보자. 

1) 어떤 수가 소수인지 판별한다.

    만약 소수가 아니면 emirp 소수가 아니다.

2) 소수이면 숫자를 문자열로 변경한다.

3) 문자열 역순으로 새로운 문자열로 만든다.

4) 문자열을 정수로 변경한다.

5) 정수가 소수인지 판별한다. 

 

아래 코드 중에 중요한 부분만 살펴보자! 

txt1 = str(number)가 보이는데

 이 부분이 바로 숫자number를 문자로 바꾸어주는 코드이다.

txt2 = txt1[::1] 

 이 부분은 문자로 바꾸어준 값의 순서를 바꾸어주는 코드이다. 

이렇게 순서를 바꾼 값을

r_number = int(txt2)로 써서 다시 숫자로 바꾸어준다! 

def prime(number):
  primeData=[2]
  for x in range(3,number+1):
    for i in primeData:
      if (x%i == 0):
        break
      elif(i==primeData[-1]):
        primeData.append(x)
        break
  if(x in primeData): 
    return 1
  else: 
    return 0

number=int(input("숫자 : "))
isPrime=prime(number)

if(isPrime):
  txt1 = str(number)
  txt2 = txt1[::-1]
  r_number = int(txt2)
  isPrime = prime(r_number)
  if(isPrime):
    print ("%d는 emirp 소수입니다"%(number))
  else:
    print ("%d는 emirp 소수가 아닙니다"%(number))
else:
  print("%d는 소수가 아닙니다"%(number))

 

 

 

3. 쌍둥이 소수인지 판별해보자. 

쌍둥이 소수는 차가 2인 소수이다.

 

ex) 3과 5는 차가 2이므로 쌍둥이 소수!

3과5, 11과 13, 17과 19, 29와 31, 41과 43가 모두 쌍둥이 소수라 할 수 있다. 

 

쌍둥이 소수의 조건을 정리해보자!

1) 만약 소수가 아니면 쌍둥이 소수가 아니다.

2) 소수라면 숫자+2가 소수인지 판별한다.

   숫자+2 가 소수이면 숫자, 숫자+2는 쌍둥이 소수이다!

 

def prime(number):
  isPrime = 1
  for i in range(2,number):
    if (number%i == 0):
      isPrime=0
      break
    if(isPrime):
      return 1
    else:
      return 0
  
dualNumber=[ ]

for i in range(3,1700):
  isPrime1=prime(i)
  isPrime2=prime(i+2)
  if(isPrime1 and isPrime2):
    dualNumber.append(i)
for i in dualNumber:
  print(i)

 

4. 차가 6인 육촌 소수를 구하는 프로그램을 만들어보자!

 

육촌 소수는 차가 6인 소수이다.

기존 소수를 구하는 코드에 i, i+6을 써주기만 하면 끝~! 

 

def prime(number):
  isPrime = 1
  for i in range(2,number):
    if (number%i == 0):
      isPrime=0
      break
    if(isPrime):
      return 1
    else:
      return 0
  
plussixNumber=[ ]

for i in range(3,1700):
  isPrime1=prime(i)
  isPrime2=prime(i+6)
  if(isPrime1 and isPrime2):
    plussixNumber.append(i)
for i in plussixNumber:
  print(i)

 

끝~!

 

소수 구하기는 좀 어려웠다...ㅠㅠ

 

특히 emirp는 숫자 23을 문자 23으로 바꾸고 문자23의 순서를 바꾸어 32로 만든 뒤 다시 숫자 32로 바꾸는 과정이

까다로웠다. 

 

그래도 일단 다양한 소수 구하기 성공!  

반응형