`
xitong
  • 浏览: 6203631 次
文章分类
社区版块
存档分类
最新评论

【欧拉计划2】Even Fibonacci numbers

 
阅读更多

该题来自Project Euler第二题,求数值小于4百万的偶数项的和。今天继续的欧拉计划。


问题描述

英语原文

Even Fibonacci numbers

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.

中文描述

在Fibonacci数列中,每一项由它的前两项之和生成。从1,2开始,前十项为:
1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
考虑Fibonacci数列中数值不超过4百万的项,求出值为偶数的项的和。

解决方案

我的解法

这是中规中矩的方法,用了点循环队列的思想,虽然可以用几个变量替代。在写代码的过程中,还犯了一个傻傻的错误,感谢论坛朋友的帮助。

# include <stdio.h>
# define BOUND 4000000

int main(void)
{
	int fib[3];
	int i;
	long long int sum;
	
	fib[0] = 1;
	fib[1] = 2;
	sum = 2;
	for(i = 2; fib[(i - 1) % 3] < BOUND; i++) {
		fib[i % 3] = fib[(i - 1) % 3] + fib[(i - 2) % 3];  //队列的思想 
		if(fib[i % 3] % 2 == 0) {
			sum += fib[i % 3];
		}
	}
	printf("%d\n", fib[(i - 2) % 3]);
	printf("%d", sum);
}

下面是题目解析提供的几种解法。

直接求解

这个方法和我的方法原理是一样的。

# include <stdio.h>
int main(void)
{
	int limit;
	int a, b, h;
	int sum;
	
	limit = 4000000;
	a = b = 1;
	sum = 0;
	while(b < limit) {
		if(b % 2 == 0) {
			sum += b;
		}
		h = a + b;
		a = b;
		b = h;
	}
	printf("%d", sum);
}

另一种方法

仔细观察数列,可以发现,每三个Fibnacci数有一个偶数。利用这个规律,可以省去条件判断。

# include <stdio.h>
int main(void)
{
	int limit;
	int a, b, c;
	int sum;
	
	limit = 4e6;
	a = 1;
	b = 1;
	c = 2;
	sum = 0;
	while(c < limit) {
		sum += c;
		a = b + c;
		b = a + c;
		c = a + b;
	}
	printf("%d", sum);
}

高效方案

如果把偶数项拿出来:
2,8,34,144……

它们遵循的这样的规律:
E(n)=4*E(n-1)+E(n-2)

# include <stdio.h>
int main(void)
{
	int limit;
	int a, b;
	int sum;
	
	limit = 4e6;
	sum = 2;
	a = 2;
	b = 8;
	while(b < limit) {
		sum += b;
		b = 4 * b + a;
		a = (b - a) / 4;    //在没有使用第三变量的情况下,变量后移
	}
	printf("%d", sum);
}

要证明上关系式成立,只需证:
F(n)=4*F(n-3)+F(n-6)

证明过程如下:
F(n) = F(n-1) + F(n-2)
= F(n-2)+F(n-3)+F(n-2)=2 F(n-2) + F(n-3)
= 2(F(n-3)+F(n-4))+F(n-3))=3 F(n-3) + 2 F(n-4)
= 3 F(n-3) + F(n-4) + F(n-5) + F(n-6)
= 4 F(n-3) + F(n-6)

最后答案

4613732

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics