윤년의 수 구하기
(100 의 배수가 아닌 4의 배수이거나 400의 배수인 연도)
def countleapyear(n):
k=0
for i in range(1,n+1):
if((i%100 != 0 and i%4 == 0) or (i%400 ==0)):
k=k+1
return k
최대공약수 구하기 (유클리드 호제법)
def gcd(a,b):
if(a==0):
return b
return gcd(b%a,a)
피보나치 수 구하기
def fibonacci(n):
if(n==0):
return 0
if(n==1):
return 1
else:
return fibonacci(n-1)+fibonacci(n-2)
10진수(문자열) -> 2진수
def strdec2bin(dec):
n=int(dec)
if(n<2):
print(n%2,end='')
else:
strdec2bin(str(n//2))
print(n%2,end='')
2진수(문자열) -> 10진수
def strbin2dec(bin):
n=int(bin)
a=0
if n>=10:
a=strbin2dec(str(n//10))
return a*2 + n%10
자연수의 분할

def computePart(n,k):
if(k<1 or n<k):
return 0
if(k==1 or k==n):
return 1
answer=0
for i in range(1,k+1):
answer+=computePart(n-k,i)
return answer
집합의 분할

def getSetPartitionCount(n,k):
# 1>=k or k>=n
if(k<=1 or n<=k):
return 1
# 1<k<n
else:
return getSetPartitionCount(n-1,k-1)+k*getSetPartitionCount(n-1,k)
Palindrome 확인
# 중간 문자열 반환
def middle(word):
return word[1:-1]
# 글자수가 없을 때 True
def is_palindrome(word):
if(len(word)==0):
return True
if word[0] != word[-1]:
return False
return is_palindrome(middle(word))
# 글자수가 없을 때 False
def is_palindrome2(word):
if(len(word)==0):
return False
if word[0] != word[-1]:
return False
if len(word) <=2:
return True
return is_palindrome2(middle(word))
루트의 근사치 (뉴턴의 방법)
(설명)
def mysqrt(a):
if(a==1):
return 1
x=a-1
epsilon=1e-6
while True:
y=(x+a/x)/2
if abs(y-x) < epsilon:
break
x=y
return y
파이의 근사치 (라마누잔 공식)

import math
def factorial(n):
if n == 0:
return 1
else:
return n*factorial(n-1)
def estimate_pi():
total = 0 # total은 1/pi의 근사치
k = 0
factor = 2 * math.sqrt(2) / 9801
while True:
num = factorial(4*k) * (1103 + 26390*k)
den = factorial(k)**4 * 396**(4*k)
term = factor * num / den
total += term
if abs(term) < 1e-15:
break
k += 1
return 1 / total
print(estimate_pi())
소인수분해
def print_factor(n):
if(n==1):
return 1
for i in range(2,n+1):
while(n%i == 0):
n=n//i
if(n == 1):
print(i)
return
else:
print(i,'*',sep='',end='')
소수 판정
def isPrime(n):
if(n<=1):
return False
elif(n==2):
return True
for i in range(2,n):
if(n%i == 0):
return False
return True
삼각형 가능 여부
(세 길이 중에 하나가 다른 두 길이의 합보다 크면 삼각형 불가)
def is_triangle(a,b,c):
if(isinstance(a,int) and isinstance(b,int) and isinstance(c,int)):
if(a>b+c or b>a+c or c>a+b):
print("No")
else:
print("Yes")
a가 b의 거듭 제곱인지 판단
(숫자 a가 b로 나눌 수 있고, a/b가 b의 거듭제곱이면 a는 b의 거듭제곱)
def is_power(a,b):
if(a==0):
return False
if(a==1):
return True
if(a==b):
return True
elif(a%b==0):
return is_power(a//b,b)
else:
return False
팩토리얼 함수의 Memo 버전
# Memo version (c type)
fac = [0 for i in range(100)]
def factorial(n):
if(n==0):
return 1
if(fac[n]):
return fac[n]
else:
fac.insert(n,n*factorial(n-1))
return fac[n]
# Memo version (python type)
known={0:1}
def factorial(n):
if n in known:
return known[n]
res=n*factorial(n-1)
known[n]=res
return res
피보나치 함수의 Memo 버전
# Memo version
known={0:0,1:1}
def fibonacci(n):
if n in known:
return known[n]
res=fibonacci(n-1)+fibonacci(n-2)
known[n]=res
return res
번외) math.sqrt와 mysqrt 비교
import math
def mysqrt(a):
if(a==1):
return 1
x=a-1
epsilon=1e-6
while True:
y=(x+a/x)/2
if abs(y-x) < epsilon:
break
x=y
return y
def test_square_root():
strFormat="%-20s%-20s%-20s%-20s"
print(strFormat%('a','mysqrt(a)','math.sqrt(a)','diff'))
print(strFormat%('-','---------','------------','----'))
for a in range(1,10):
print(strFormat%(str(float(a)),str(float(mysqrt(a))),str(math.sqrt(a)),str(abs(float(mysqrt(a))-math.sqrt(a)))))