[그림 01] Problem 002 문제
문제를 살펴보면 다음과 같습니다.
문제 이름 : 짝수 피보나치 숫자들
문제 내용 : 각 단계마다 피보나치가 생성되는데, 피보나치의 다음 단계는 두 개의 단계(번째)를 더하여 생성됩니다. 1과 2로 시작하여 10단계를 생성해보면 다음과 같이 생성됩니다.
1, 2, 3, 5, 8, 13, 21, 34, 55, 89 ....
이제 이를 고려하여 4,000,000(4백만, 4million)을 넘지 않는 각 단계를 계속 생성할 때, 생성된 값이 짝수들인 단계를 모두 더한 값을 구하십시오.
우리는 다음과 같은 조건을 가진다는 것을 알 수 있습니다.
1. 피보나치의 원리를 이용하여 다음 단계를 계속 생성함
2. 생성된 단계가 400만을 넘지 않아야 함
3. 생성된 값 중 짝수인 것을 모두 더해야 함
이제 소스코드를 작성해보도록 합시다.
#Project Euler Problem 002
#Python 3 version source
#even-valued terms' Sum value --> 짝수의 값으로 나오는 term을 모두 더함
def Define_Fibonacci(ex_number, number): #피보나치 생성함수
next_number = ex_number + number
return number, next_number
def Even_Value_Sum(Fibo_list): #짝수 값을 구분하여 더함
Even_Fibo_Sum = 0
for i in range(len(Fibo_list)):
if Fibo_list[i] % 2 == 0:
Even_Fibo_Sum += Fibo_list[i]
return Even_Fibo_Sum
if __name__ == "__main__":
Fibonacci_Limit = 4000000 #피보나치 값이 넘지 않아야 할 한계값
Fibonacci_Sum = 0 #피보나치 짝수 값을 더할 변수
Fibonacci_List= [1,2] #피보나치 배열
i = 0
while True:
main_num, main_next_num = Define_Fibonacci(Fibonacci_List[i],Fibonacci_List[i+1])
if main_next_num <= Fibonacci_Limit: #피보나치 값이 한계값을 넘지 않으면 피보나치 배열에 추가함
Fibonacci_List.append(main_next_num)
else: #400만을 넘는 값이 생성되면 출력하고 종료
print("Even Fibo Sum : ", Even_Value_Sum(Fibonacci_List))
break
i += 1 #While문의 횟수를 표시
#print(Fibonacci_List) #피보나치 배열을 출력할 수 있음
위의 소스는 문제를 해결하는 소스입니다.
먼저 메인에서는 한계값을 지정한 변수, 더해줄 변수, 피보나치 배열을 선언합니다.
그리고 While 무한 반복으로 피보나치 단계 중 400만이 넘는 값이 나오기 전까지 반복해줍니다.
Define_Fibonacci를 통해 다음 피보나치 단계를 생성하고, Even_Value_Sum을 통해 피보나치 리스트에 있는 값 중 짝수 값을 골라 더해주고, 이를 반환해줍니다.
그리고 이외에 홀수, 그리고 피보나치 배열의 모든 값을 더하는 기능을 추가한 소스는 다음과 같습니다.
#Project Euler Problem 002
#Python 3 version source
#even-valued terms' Sum value --> 짝수의 값으로 나오는 term을 모두 더함
def Define_Fibonacci(ex_number, number):
next_number = ex_number + number
return number, next_number
def Even_Value_Sum(Fibo_list):
Even_Fibo_Sum = 0
for i in range(len(Fibo_list)):
if Fibo_list[i] % 2 == 0:
Even_Fibo_Sum += Fibo_list[i]
return Even_Fibo_Sum
def Odd_Value_Sum(Fibo_list):
Odd_Fibo_Sum = 0
for i in range(len(Fibo_list)):
if Fibo_list[i] % 2 == 1:
Odd_Fibo_Sum += Fibo_list[i]
return Odd_Fibo_Sum
def Whole_Value_Sum(Fibo_list):
Whole_Fibo_Sum = 0
for i in Fibo_list:
Whole_Fibo_Sum += i
return Whole_Fibo_Sum
if __name__ == "__main__":
Fibonacci_Limit = 4000000
Fibonacci_Sum = 0
Fibonacci_List= [1,2]
i = 0
while True:
main_num, main_next_num = Define_Fibonacci(Fibonacci_List[i],Fibonacci_List[i+1])
if main_next_num <= Fibonacci_Limit:
Fibonacci_List.append(main_next_num)
else:
print("Even Fibo Sum : ", Even_Value_Sum(Fibonacci_List))
print("Odd Fibo Sum : ", Odd_Value_Sum(Fibonacci_List))
print("Whole Fibo Sum: ", Whole_Value_Sum(Fibonacci_List))
break
i += 1
#print(Fibonacci_List)
늘 느끼는 거지만, 저보다 잘하는 사람은 늘 있습니다.
출처 : http://www.s-anand.net/euler.html
cache = {} #dict == dictionary 형태의 타입 // type(cache) == 'dict'
def fib(n):
cache[n] = cache.get(n, 0) or (n <= 1 and 1 or fib(n-1) + fib(n-2))
return cache[n]
n = 0
i = 0
while fib(i) <= 4000000:
if not fib(i) % 2: n = n + fib(i)
i = i + 1
print(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_003_Largest prime factor (0) | 2016.12.30 |
| Problem_001_Multiples of 3 and 5 (0) | 2016.12.28 |