팩토리얼 로직 관련
참고로 이거 출근하다가 지하철에서 생각남…ㅋㅋㅋㅋㅋㅋ 6호선 생각보다 자리 없어요… 각설하고. 계승, 그러니까 팩토리얼이 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)
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)
위가 for, 아래가 while이다. for문 코드의 경우 순열조합 코드에도 함수로 들어가 있다. (함수로 들어간 코드는 print 대신 return으로 들어간다)
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))
이쪽이 판별 코드. 왜 저게 AND가 있냐면 n! – 1이랑 n! + 1 두개가 다 소수인 예가 있다. (3! + 1은 7, 3! – 1은 5로 둘 다 소수)
Reply