2번문제

Each new term in the Fibonacci sequence is generated by adding the previous two terms. 
By starting with 1 and 2, the first 10 terms will be:

1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

By considering the terms in the Fibonacci sequence whose values do not exceed four million, 
find the sum of the even-valued terms.

해석 : 

피보나치 수열의 다음 수열은 이전의 두 수열을 더한 합과 같다

1과 2로 시작하여 처음 10번째까지의 수열은 다음과 같다:

 

1, 2, 3, 5, 8, 13, 21, 34, 55, 89

 

4백만이 넘지 않는 피보나치 수열이 있다고 가정할때 

짝수인 피보나치의 수열을 합을 구하여라

 

코드는 아래와 같다 

     public static void main(String []args){
        int sum = 0;
		int f1 = 1;
		int f2 = 1;
		while(f1<4000000){
			f1 = f1 + f2;
			f2 = f1 - f2;
			if(f1%2==0){
				sum=sum+f1;
			}
		}
		System.out.print(sum);
     }

문제가 물어보는 것은 피보나치 수열을 짤 수 있느냐를 물어보는 것 같다. 

 

int buf =0;
int f1 = 1;
int f2 = 1;
	while(true){
		buf = f2;
		f2 = f1+f2;
		f1 = buf;
	}

 

1번째 줄은 임시 변수

2번째 줄의 f1은 피보나치 첫번째 수열인 1
3번째 줄의 f2는 피보나치 두번째 수열인 1이고

 

나머지는 일반적으로 간단하게 생각할 수 있는 변수를 3개를 사용하여 계속해서 피보나치 수열을 만들어가는 방법이다

(코드는 돌리지 마시길.. 무한 루프임ㅋㅋ)

 

하지만 조금 생각해보면 만들어질 새운 피보나치 수열은 현재 변수 2개로 만든다!

 

int f1 = 1;
int f2 = 1;
	while(true){
		f1 = f1 + f2;
		f2 = f1 - f2;
	}

위 코드를 잘 보면

 

4번째 줄에서 하는 작업은 피보나치의 다음 수열을 현재 두개의 변수로 생성한다

 

이게 핵심인데 피보나치 수열을 이항하면 F[n-1] = F[n] - F[n-2]와 같은 식이 나오는데

피보나치의 다음수열에서 이전전 수열을 빼면 이전 수열이 나온다는 소리이다. 

 

4번째줄에서 f1변수는 F[n]을 저장하였고 f2변수는 F[n-2]를 저장하고 있기 때문에 둘이 빼면 F[n-1]을 얻을 수 있다!!!

 

말로 설명하니까 햇갈릴수도 있는데, 직접 수를 대입해서 몇번만 해보면 이해갈것이다. 

 

 

문제 조건이 짝수인 피보나치인 수를 더하는 것이기 때문에 mod operation으로

홀수를 걸러주면서 더해주면 답이 나온다!

'Programming > ProjectEuler' 카테고리의 다른 글

ProjectEuler 3  (2) 2021.01.05
ProjectEuler 1  (0) 2021.01.04

+ Recent posts