欧拉项目【ProjectEuler】系列-第二题

欧拉项目【ProjectEuler】系列-第二题 

----人既无名

Problem2: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.

意思是,对于斐波拉切数列,求出不超过4000000的所有值为偶数的项的和。

首先我想介绍一些斐波拉切数列的一些基本介绍,因为斐波拉切数列是一个非常奇特的数列.

如果定义第一项F(0)=0,第二项F(1)=1,以后每一项都是前两项的和。

F(n+2)=F(n) + F(n+1), 其中n=0,1,2,3,...

斐波拉切数列的一些基本特性:

1. F(0)+F(1)+F(2)+...+F(n)=F(n+2)-1

2.F(1)+F(3)+F(5)+...+F(2n-1)=F(2n)

3.F(0)+F(2)+F(4)+...+F(2n)=F(2n+1)-1

4.F(m+n-1)=F(m-1)F(n-1)+F(m)F(n)(利用该项可以构造复杂度为O(logn)的程序)

5.F(n)^2=F(n+1)F(n-1)+(-1)^(n-1)(斐波那契数列中任一项的平方数都等于跟它相邻的前后两项的乘积加1或减1)

6.F(n+2)F(n-1)-F(n+1)F(n)=1(相邻的四个斐波那契数,中间两数之积(内积)与两边两数之积(外积)相差1)

此外,斐波那契数列的通项公式为

Fn 看似是无理数,但当 n ≧0 時,Fn 都是整数  

利用斐波那契数列來做出一個新的数列:

方法是把数列中相邻的数字相除,以组成新的数列如下:

0/1,1/1,1/2,2/3,...,F(n)/F(n-1)

當 n 無限大時,數列的極限是:

   
  

這個數值稱為黃金分割比,它正好是方程式 x^2+x-1=0 的一個根.

分析1:

其实不用了解太多也可以把这个题目解出来,但是了解一下这个奇特的数列还是很有趣的。现在我们开始对题目进行分析,首先要说的是题目说的是求出所有值为偶数的项(F(n)<4000000)的和.也就是要求F(n)%2==0,而不是F(2n)。

因此最简单的办法是遍历小于4000000 的所有项,是偶数的时候就加起来

int Fuc1()
{
	int a=1;
	int b=2;
	int c=2;
        int sum=0;
     for(;c<400000000;)
     {
           if(c%2==0)
                sum+=c;
           c=a+b;
           a=b;
           b=c;
     }
    return sum;
}

分析2:

在论坛中看到还有这样一种思路,因为

Fn/Fn-1 → Φ (Φ为黄金分割比)

Fn/Fn-2 = (Fn/Fn-1)/(Fn-2/Fn-1) → Φ/(1/Φ) = Φ2 

Fn/Fn-3 = (Fn/Fn-2)/(Fn-3/Fn-2) → Φ2/(1/Φ) = Φ3

Φ3=4.236068,因为不需要完全的精确,因此可以用这种方法来解决这个问题。这个思路真的很不错,因为它简化了我们的操作步骤,可以加快运算的速度。

int Fuc2()
{
	int sum=0;
	for(int i=2;i<400000000;i=i*4.236068)
	{
		sum+=i;
	}
        return sum;
}

看到如此简单的运算我自己也震惊了,虽然运算的结果与实际的正确结果并不完全一致,但是步骤是如此的简单。不得不感叹别人的想法就是比我聪明啊。

还有一种思路是这样的,因为斐波拉切数列特点(x=y=1)

1,1, 2, 3, 5, 8,....
x,y,x+y,x+2y,2x+3y,3x+5y,...

int  Fuc3()
{
	int	x=1;
	int y=1;
	int sum=0;
	int r;
	while (sum < 4000000)
	{
		sum += (x + y);
		r=x;
		x= r + 2*y;
		y=2*r + 3*y;
	}
	return sum;
}

最后

对于本题数列的起始是1 ,2 。

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

这些偶数组成一个新的数列

2,8,34,144,...

根据递推公式

F(n)=F(n-1)+F(n-2)=2F(n-2)+F(n-3)

 
  =2F(n-2)+F(n-3)=3F(n-3)+2F(n-4)

 
  =3F(n-3)+F(n-4)+F(n-5)+F(n-6)

    =4F(n-3)+F(n-6);

这是个高中的递推公式啊!!!

int  Fuc4()
{//Fn=4*F(n-3)+F(n-6)
	int sum=0;
	int fn;
	int fn_3=8;
	int fn_6=2;
	while(fn_6<4000000)
	{
		sum+=fn_6;
		fn=4*fn_3+fn_6;
		fn_6=fn_3;
		fn_3=fn;
	}
	return 	sum;
}
时间: 2024-08-02 19:42:16

欧拉项目【ProjectEuler】系列-第二题的相关文章

欧拉项目【ProjectEuler】系列-第一题

欧拉项目[ProjectEuler]系列-第一题 ----人既无名 既然是第一次,当然要写个基本的介绍咯. 欧拉项目是一系列挑战数学/计算机编程的问题. 需要的不仅仅是数学见解,还要利用计算机编程技巧,需要解决大多数问题,当然,数学帮助你运用优雅而有效的方法,实现漂亮而快速的代码. 欧拉项目的网站是http://projecteuler.net,只要上去注册一个账号就可以开始你的欧拉之旅了,当你把一个问题解决之后就可以参加该问题的讨论,说说你的解决办法,看看其他人的处理思路咯.言归正传,开始欧拉

HDU 1286 找新朋友(欧拉函数模板)

HDU 1286 找新朋友:http://acm.hdu.edu.cn/showproblem.php?pid=1286 题意:中文题. 思路:欧拉函数的纯模板题,没什么好说的,主要是理解欧拉函数的意义. 在数论,对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目.此函数以其首名研究者欧拉命名,它又称为Euler's totient function.φ函数.欧拉商数等. 例如φ(8)=4,因为1,3,5,7均和8互质.   ----by度娘. 更多精彩内容:http://www.bia

UVa 10129:Play on Words, 欧拉道路

题目链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=105&page=show_problem&problem=1070 题目类型: 欧拉道路 题目: Some of the secret doors contain a very interesting word puzzle. The team of archaeologists has to solve

如何用线性筛法求欧拉函数

前几天做了一个关于欧拉函数的题,当时就做超时了,因为我是暴力做的,后来百度了一下 线性晒法求欧拉函数,所以今天就打算系统的看一下筛法求欧拉函数的问题,该算法在可在线性时间内筛素数的同时求出所有数的欧拉函数: 先介绍一下暴力的欧拉函数: Eular(m) = m - (1-1/p1) - (1-1/p2) - ... - (1-1/pk)  [其中 p1, p2...pk为m的素因子] int Eular(int m) { int ret = m; for(int i=2; i<m; i++) {

A - Farey Sequence——(筛法求欧拉函数)

传送门 A - Farey Sequence Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Description The Farey Sequence Fn for any integer n with n >= 2 is the set of irreducible rational numbers a/b with 0 < a < b &l

算法帝国里的牛人们:欧拉

1791年,著名奥地利作曲家约瑟夫·海顿出席了乔治·弗里德里希·亨德尔在伦敦威斯敏斯特大教堂的盛大清唱剧<弥赛亚>的演出.演出快要结束时,海顿被上千名合唱队和管弦乐队成员感动得热泪盈眶,他在泪光中盛赞和他同时代的亨德尔"是我们所有人的大师". 与此同时,促进统计学发展的思想巨人之一.法国数学家皮埃尔-西蒙·拉普拉斯也惊叹地说了同样的话,但他指的不是亨德尔,而是莱昂哈德·欧拉. 欧拉毕业于巴赛尔大学,这所大学曾经培养了很多改变世界的知识精英.巴赛尔大学是瑞士最古老的大学,由教

欧拉函数模板

欧拉函数:表示1-(n-1)中,与n互质的数的个数 本以为学会容斥原理就不必再看欧拉函数,可是偏偏就是有些题用容斥原理解不了,必须参考欧拉,没办法只好回头看欧拉函数 下面贴一个筛法求欧拉函数模板: //初始化eu[1]=0或者eu[1]=1,具体情况根据题目变化! //下面计算2-10000的欧拉函数 const int MAX = 10001; int eu[MAX];//不要忘记初始化eu[1]. void eular(){ for(int i=2;i<MAx;i++){ if(!eu[i]

“金山杯2007逆向分析挑战赛”第一阶段第二题

注:题目来自于以下链接地址:http://www.pediy.com/kssd/ 目录:第13篇 论坛活动 \ 金山杯2007逆向分析挑战赛 \ 第一阶段 \ 第二题 \ 题目 \ [第一阶段 第二题]   题目描述:   己知是一个 PE 格式 EXE 文件,其三个(section)区块的数据文件依次如下:(详见附件)  _text,_rdata,_data 1. 将 _text, _rdata, _data 合并成一个 EXE 文件,重建一个 PE 头,一些关键参数,如 EntryPoint

图形化编程实现改进的欧拉格式和龙格库塔格式。这里有个C语言的,想改写成C#。

问题描述 图形化编程实现改进的欧拉格式和龙格库塔格式.这里有个C语言的,想改写成C#. 1)改进欧拉法求解常微分方程的初值问题 #include float func(float x,float y) { return(y-x); } float euler(float x0,float xn,float y0,int N) { float x,y,yp,yc,h; int i; x=x0; y=y0; h=(xn-x0)/(float)N; for(i=1;i<=N;i++) { yp=y+h