[Intermediate Algorithm] - Sum All Odd Fibonacci Numbers

题目

给一个正整数num,返回小于或等于num的斐波纳契奇数之和。

斐波纳契数列中的前几个数字是 1、1、2、3、5 和 8,随后的每一个数字都是前两个数字之和。

例如,sumFibs(4)应该返回 5,因为斐波纳契数列中所有小于4的奇数是 1、1、3。

提示

此题不能用递归来实现斐波纳契数列。因为当num较大时,内存会溢出,推荐用数组来实现。

参考文档:博客园Issue 
Remainder

测试用例

  • sumFibs(1) 应该返回一个数字。
  • sumFibs(1000) 应该返回 1785
  • sumFibs(4000000) 应该返回 4613732
  • sumFibs(4) 应该返回 5
  • sumFibs(75024) 应该返回 60696
  • sumFibs(75025) 应该返回 135721

分析思路

斐波那契数第一个和第二个为 1 是固定的,所以初始数组可以设置为: 
var fibsArray = [1, 1]; 
然后根据最后一个数等于前两数之和设置下一个数组元素,这样就组成了需要的斐波那契数组。对于奇数直接计算提出就行。

代码

1.function sumFibs(num) {
2.  var fibsArray = [1, 1];
3.  var retVal = 1;
4.
5.  while (fibsArray[fibsArray.length - 1] <= num) {
6.    if (fibsArray[fibsArray.length - 1] % 2) {
7.      retVal += fibsArray[fibsArray.length - 1];
8.    }
9.    fibsArray.push(fibsArray[fibsArray.length - 2] + fibsArray[fibsArray.length - 1]);
10.  }
11.  fibsArray.pop(); /* 去除最后一个大于 num 的数 */
12.
13.  return retVal;
14.}
15.
16.sumFibs(4);
另一个不用到数组的方法,该方法主要是针对该题的
1.function sumFibs(num) {
2.  var fibo = [1, 1];
3.  var oddSum = 2;
4.
5.  while(true){
6.    var item = fibo[0] + fibo[1];
7.    if(num < item){
8.      return oddSum;
9.    }
10.    if(item % 2){
11.      oddSum += item;
12.    }
13.    fibo[0] = fibo[1];
14.    fibo[1] = item;
15.  }
16.}
17.
18.sumFibs(4);
 
时间: 2024-12-27 17:50:33

[Intermediate Algorithm] - Sum All Odd Fibonacci Numbers的相关文章

Sum All Odd Fibonacci Numbers

刚开始我看到Fibonacci我就直接写了计算斐波那契数列的算法后来发现掉坑里了,觉得挺有意思的就分享一下吧 题目 返回所有小于传入数值的斐波那契数列中的奇数之和,如果传入的数值是斐波那契数,那么它也应该参与求和. 斐波那契数列中的前几个数字是 1.1.2.3.5 和 8,随后的每一个数字都是前两个数字之和. 例如,向 function 传入 4 应该返回 5,因为斐波那契数列中所有小于 4 的奇数是 1.1.3. 测试: sumFibs(1) 应该返回一个数字.sumFibs(1000) 应该

codeforces 446C DZY Loves Fibonacci Numbers(数学 or 数论+线段树)

In mathematical terms, the sequence Fn of Fibonacci numbers is defined by the recurrence relation F1 = 1; F2 = 1; Fn = Fn - 1 + Fn - 2 (n > 2). DZY loves Fibonacci numbers very much. Today DZY gives you an array consisting of n integers: a1, a2, ...,

Codeforces446C DZY Loves Fibonacci Numbers(线段树 or 分块?)

第一次看到段更斐波那契数列的,整个人都不会好了.事后看了题解才明白了一些. 首先利用二次剩余的知识,以及一些数列递推式子有下面的 至于怎么解出x^2==5(mod 10^9+9),我就不知道了,但是要用的时候可以枚举一下,把这些参数求出来之后就题目就可以转化为维护等比数列. 由于前面的常数可以最后乘,所以就等于维护两个等比数列好了. 下面我们来看如何维护一个等比数列.假如我对区间[L,R]的加上1,2,4,8...2^n的话,那么我只需要加一个标记x表示这个区间被加了多少次这样的2^n. 举个例

codeforces 446C DZY Loves Fibonacci Numbers 线段树

假如F[1] = a, F[2] = B, F[n] = F[n - 1] + F[n - 2]. 写成矩阵表示形式可以很快发现F[n] = f[n - 1] * b + f[n - 2] * a. f[n] 是斐波那契数列 也就是我们如果知道一段区间的前两个数增加了多少,可以很快计算出这段区间的第k个数增加了多少 通过简单的公式叠加也能求和 F[n]  = f[n - 1] * b + f[n - 2] * a F[n - 1] = f[n - 2] * b + f[n - 3] * a ..

HDU 3117 Fibonacci Numbers(Fibonacci矩阵加速递推+公式)

题目意思很简单:求第n个Fibonacci数,如果超过八位输出前四位和后四位中间输出...,否则直接输出Fibonacci数是多少. 后四位很好求,直接矩阵加速递推对10000取余的结果就是. 前四位搜了一下:http://blog.csdn.net/xieqinghuang/article/details/7789908 Fibonacci的通项公式,对,fibonacci数是有通项公式的-- f(n)=1/sqrt(5)(((1+sqrt(5))/2)^n+((1-sqrt(5))/2)^n

[CodeForces - 447E] E - DZY Loves Fibonacci Numbers

E  DZY Loves Fibonacci Numbers In mathematical terms, the sequence Fn of Fibonacci numbers is defined by the recurrence relation F1?=?1; F2?=?1; Fn?=?Fn?-?1?+?Fn?-?2 (n?>?2). DZY loves Fibonacci numbers very much. Today DZY gives you an array consist

POJ 2739 Sum of Consecutive Prime Numbers(水题)

Sum of Consecutive Prime Numbers Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 20560   Accepted: 11243 Description Some positive integers can be represented by a sum of one or more consecutive prime numbers. How many such representatio

leetcode --day12 Surrounded Regions &amp; Sum Root to Leaf Numbers &amp; Longest Consecutive Sequence

1.  Surrounded Regions Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'. A region is captured by flipping all 'O's into 'X's in that surrounded region. For example, X X X X X O O X X X O X X O X X After running your fu

hdu 3117 Fibonacci Numbers

点击此处即可传送到hdu 3117 **Fibonacci Numbers** Problem Description The Fibonacci sequence is the sequence of numbers such that every element is equal to the sum of the two previous elements, except for the first two elements f0 and f1 which are respectively