[그림 01] Problem 003 문제
문제를 살펴보면 다음과 같습니다.
문제 이름 : 가장 큰 소수는?
문제 내용 : 13195의 소수들은 5, 7, 13 그리고 29로 이루어져 있습니다. 즉, 5*7*13*29가 13195라는 것입니다. 그렇다면 600851475143에서 가장 큰 소수는 무엇입니까?
우리는 다음과 같은 조건을 가진다는 것을 알 수 있습니다.
1. 600851475143이라는 숫자는 소수의 곱으로만 이루어져 있음
2. 소수를 구하여 위의 숫자를 나누어주고, 그 중 가장 큰 녀석을 찾아내야 함
이제 소스코드를 작성해보도록 합시다.
#Project Euler Problem 003
#Python 3 version source
#13195 는 5 x 7 x 13 x 29라는 소수로 이루어져 있다. 600851475143에서 가장 큰 소수는 무엇인가?
#getPrime == 소수 구하기 함수
def GetPrimeAndDivision(Value):
primeList = [2] #소수 리스트 생성
divideList = list() #나누어지는 소수의 리스트
num = 3 #3부터 소수인지 검사함
while(num <= Value):
for x in primeList:
if(num % x == 0): #소수로 나누었을 대 나누어지면 소수 아님
break
elif(x == primeList[-1]): #소수리스트의 끝원소로도 나누어지지 않으면 소수
primeList.append(num) #구한 소수를 소수 리스트에 추가
if Divide_LimitValue(num, Value): #참 값이 반환되면 실행
divideList.append(num)
Value = Value / num
break
num += 1
return divideList
def Divide_LimitValue(PrimeNum, LimitValue): #소수로 값을 나눠보도록 함
Answer = LimitValue % PrimeNum
if Answer == 0: #소수가 나누어 떨어지면 나누어지는 소수 값을 반환
return PrimeNum
else:
return 0
if __name__ == "__main__":
Main_LimitValue = 600851475143
Main_FactorList = list()
i = 0
Main_PrimeList, Main_DivideList = GetPrimeAndDivision(Main_LimitValue)
print("Main Divided List : ", Main_DivideList)
메인에서는 소수로 곱해진 값을 정의해주었고, 함수를 하나 실행할 뿐입니다.
그리고 GetPrimeAndDivision에서는 한계값을 받아오고, 그 값보다 작은 소수를 찾아내어 Divide_LimitValue를 통해서 나누어떨어지는지 확인합니다.
확인이 완료되면, 그 값을 divideList에 append해주고, 600851475143을 나누어지는 소수로 나누어 다음 값을 알아내도록 합니다.
완료가 되면, Main_DivideList로 받아 출력하도록 하였습니다.
저보다 굉장한 사람은 늘 있습니다.
참고하고자 소스를 가져왔습니다.. 흑흑 비교가 많이 되지만 이를 참고하여 점점 더 발전해야지요.
출처 : http://www.s-anand.net/euler.html
n = 600851475143
i = 2
while i * i < n:
while n % i == 0:
n = n / i
i = i + 1
print(n)
막상 보니까 겁나 짧네요. 헛웃음이 슬쩍 저를 찌르고 들어갑니다.
저는 비로소 이 소스를 보고 이렇게 될 뿐이었습니다.
생각해보니 그렇습니다.
어차피 n에 저장되어 있는 값은 소수들의 곱으로 이루어져 있습니다. 즉, 나누어 떨어진다면, 그 숫자는 소수라는 것입니다.
그렇다면, 그냥 나누어 떨어지기만 하는 것을 쭉 골라내고, 만약 더 이상 나누어지지 않으면 출력하면 됩니다.
헉헉... 쩐당... 기존의 조건을 활용하다니. 닫인 머리뚜껑을 열어야 합니다 흑흑!!!
'PYTHON > Project Euler(프로젝트 오일러)' 카테고리의 다른 글
| Problem_009_Special Pythagorean triplet (0) | 2017.01.20 |
|---|---|
| Problem_008_Largest product in a series (0) | 2017.01.09 |
| Problem_007_10001st prime (0) | 2017.01.09 |
| Problem_006_Sum square difference (0) | 2017.01.07 |
| Problem_005_Smallest Multiple (0) | 2017.01.06 |
| Problem_004_Largest palindrome product (0) | 2017.01.03 |
| Problem_002_Even Fibonacci numbers (0) | 2016.12.28 |
| Problem_001_Multiples of 3 and 5 (0) | 2016.12.28 |