Factorial 로직 수정
재밌는 사실을 하나 알려주자면 출근길에 지하철에서 멍때리다 생각난거임... 6호선 생각보다 자리 없어요 여러분.
팩토리얼(n!) 그니까 계승이 1부터 n까지 쭉 곱하는거인 건 맞다. 맞는데 문제가 두 가지 있다.
첫째, 0! = 1이다. (0 아님)
둘째, 음수는 팩토리얼이 없다. (정수가 아닌 유리수는 감마함수 때려박으면 된다나...)
그래서 이 두 가지 케이스에 대한 처리를 해야 한다.
import sys a = int(sys.stdin.readline()) # Factorial(계승): 일반적으로 n! = 1*2*3*...*n-1*n이다. (5!=1*2*3*4*5) factorial = 1 if a < 0: print("Can't calculate factorial") # 음수는 factorlal이 없음 elif a == 0: print(factorial) # 0! = 1 else: for i in range(a,0,-1): factorial *= i print(factorial)
for
import sys a = int(sys.stdin.readline()) # 와 팩토리얼이 생각보다 빡센거였구나... # Factorial(계승): 일반적으로 n! = 1*2*3*...*n-1*n이다. (5!=1*2*3*4*5) factorial = 1 if a < 0: print("Can't calculate factorial") # 음수는 factorial이 없음 elif a == 0: factorial = 1 # 0! = 1 else: while a >= 1: factorial *= a a -= 1 print(factorial)
while
def factorial(a): factorial = 1 if a < 0: return False elif a == 0: factorial = 1 return factorial else: for i in range(a,0,-1): factorial *= i return
순열/조합에 함수로 이식된 형태
계승 소수
이건 뭐냐면 n! - 1이나 n! + 1이 소수인 걸 말한다. 끝. (대충 펀쿨섹좌 짤) 와 이걸 이렇게
import sys a = int(sys.stdin.readline()) # 역사와 전통의 그거 맞음 def factorial(a): factorial = 1 if a < 0: return False elif a == 0: factorial = 1 return factorial else: for i in range(a,0,-1): factorial *= i return factorial # Factorial 구하는 로직(...) def isprime(a): sqrt = int(a ** 0.5) if a < 2: return False for i in range(2,sqrt+1): if a % i == 0: return False else: return True # 소수 정의 함수 plus_factorial = factorial(a) + 1 minus_factorial = factorial(a) - 1 if isprime(minus_factorial) and isprime(plus_factorial): print("{}! - 1, {}! + 1 둘 다 {}, {}로 계승 소수입니다. ".format(a,a,minus_factorial,plus_factorial)) elif isprime(minus_factorial): print("{}! - 1이 {}로 계승 소수입니다. ".format(a,minus_factorial)) elif isprime(plus_factorial): print("{}! + 1이 {}로 계승 소수입니다. ".format(a,plus_factorial)) else: print("{}! - 1, {}! + 1 둘 다 {}, {}로 계승 소수가 아닙니다. ".format(a,a,minus_factorial,plus_factorial))
이게 전체 코드다. 코드 자체는 크게 입력/함수/계산/판별로 나뉜다.
참고로 본인 원래 모듈이랑 함수정의 다 맨 위에서 해버리는 스타일임. 제한효소때도 그래서 class가 위로 갔었다.
def factorial(a): factorial = 1 if a < 0: return False elif a == 0: factorial = 1 return factorial else: for i in range(a,0,-1): factorial *= i return factorial # Factorial 구하는 로직(...) def isprime(a): sqrt = int(a ** 0.5) if a < 2: return False for i in range(2,sqrt+1): if a % i == 0: return False else: return True # 소수 정의 함수
함수는 팩토리얼이랑 소수 판별 두 개가 들어가 있다.
if isprime(minus_factorial) and isprime(plus_factorial): print("{}! - 1, {}! + 1 둘 다 {}, {}로 계승 소수입니다. ".format(a,a,minus_factorial,plus_factorial)) elif isprime(minus_factorial): print("{}! - 1이 {}로 계승 소수입니다. ".format(a,minus_factorial)) elif isprime(plus_factorial): print("{}! + 1이 {}로 계승 소수입니다. ".format(a,plus_factorial)) else: print("{}! - 1, {}! + 1 둘 다 {}, {}로 계승 소수가 아닙니다. ".format(a,a,minus_factorial,plus_factorial))
이쪽이 판별 부분. 위키피디아에 예시로 나온 것 중에 n! - 1이랑 n! + 1 둘 다 소수인 게 있는데 3이 그 예이다. (6 - 1은 5고 6 + 1은 7)
'Coding > Python' 카테고리의 다른 글
이중계승 추가 (0) | 2022.08.22 |
---|---|
팩토리얼 로직 또 수정 (0) | 2022.08.22 |
순열조합 (0) | 2022.08.22 |
워드클라우드 코드에 기능 추가 (0) | 2022.08.22 |
List comprehension (0) | 2022.08.22 |