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 |