Project Euler 5 '최소의 배수' 세 가지 대답 방법을 생각해 보았다.
4744 단어 ProjectEuler파이썬
그렇다면 1에서 20까지의 모든 정수로 나눌 수있는 숫자 중 가장 작은 양수는 얼마입니까?
ㅡㅡㅡ//오…사쿠라. 네. jp/p로지ぇc테우ぇr/그리고 x. php? cmd=레아 d&파게=P로 b㎇m% 205
최소 배수 †
2520은 1에서 10 사이의 모든 정수로 나눌 수있는 숫자이며, 그 중 가장 작은 값입니다.
그렇다면 1에서 20까지의 모든 정수로 나눌 수있는 숫자 중 가장 작은 양수는 얼마입니까?
ㅡㅡㅡ//오…사쿠라. 네. jp/p로지ぇc테우ぇr/그리고 x. php? cmd=레아 d&파게=P로 b㎇m% 205
답변안 1
유클리드 호제법을 사용한다.
h tp // 그럼.ぃきぺぢ아. 오 rg/우키/%에 3% 83% 아 6% 에 3% 83% BC% 에 3% 82% 아 F% 에 3% 83% 아 네 3% 81% 네 % 에 4% 예 % 92% 에 9% 99% 아 4% 에 6% B3% 95
def gcd(m,n):
while n != 0:
(m,n) = (n,m%n)
return m
def lcm(m,n):
return m*n/gcd(m,n)
def cof1():
max = 20
i = 6
for j in range(5,max+1):
i = lcm(i,j)
#print i
답변안 2
다음과 같이 소인수 분해할 수 있는 수 m, n의 최소 공배수는,
m = p1^n1*p2^n2
n = p1^n3*p3^n4
동일한 소수를 포함하는 (상기라면 p1) → 지수 n1, n3의 큰 쪽을 취한 p1^(max(n1, n3))를 인자로 한다.
한편 밖에 없는 소수(위라면 p2, p3) → p2^n2, p3^n4를 인자로 한다.
→수를 소인수분해하여 {소수:지수}라는 사전으로 나타내고, 상기의 계산으로부터 최소 공배수를 구한다.
위를 이전에 만든 mymath를 사용하여 다음과 같이 구현해 보았다.
ぃ tp // 코 m / 코 f / ms / 45d3823c3d71E7E22920
import mymath
def cof2():
max = 20
pri = mymath.get_primes(max)
num1 = mymath.factor_dict(2,pri)
for i in range(3,max+1):
num2 = mymath.factor_dict(i,pri)
num1 = mymath.lcm_dict(num1,num2)
ans = mymath.dict2num(num1)
print ans
답변안 3
1에서 max까지 연속하는 수의 최소 공배수 L은 max 이하의 소수 p1, p2, ‥를 사용하여
L = p1^n1*p2^n2*p3^n3‥
라고 표현할 수 있다.
여기서, 각 p1^n1은 max 이하이다.
이를 찾는 데는 다음 두 가지 접근법이 있지만 계산량을 줄이기 위해 후자를 취했습니다.
import mymath
def cof3():
max = 20
#20までの素数列を生成
pri = mymath.get_primes(max)
ans = 1
j=1
i=-1
while i!=0:
i=0
#素数それぞれを、その累乗数がmaxを超えない範囲で答えに掛け合わせる
while i < len(pri['list']) and pri['list'][i]**j <= max:
ans *= pri['list'][i]
i+=1
j+=1
#print ans
3개 정도 시험해도, 결과적으로 역시 유클리드의 호제법이 가장 빠른. 유클리드 선생님 파랏스. (10,000회 실행)
Reference
이 문제에 관하여(Project Euler 5 '최소의 배수' 세 가지 대답 방법을 생각해 보았다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/cof/items/5c9670c4ac3f7988ae14텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)