Project Euler 5 '최소의 배수' 세 가지 대답 방법을 생각해 보았다.

4744 단어 ProjectEuler파이썬
2520은 1에서 10 사이의 모든 정수로 나눌 수있는 숫자이며, 그 중 가장 작은 값입니다.

그렇다면 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회 실행)

좋은 웹페이지 즐겨찾기