甚至斐波那契数在“给定”范围内

时间:2018-07-05 16:58:12

标签: java

此代码在起始值为0、1时可以完美地工作。但是,如果我想指定起始值(如终止值)怎么办?而不是0-500 = 188;我们把18-500 =?;最终创建一个采用范围起始值和终止值的方法。

int evenFibSum(int limit)
{
    if (limit < 2)
        return 0;

    long ef1 = 0, ef2 = 2;
    long sum = ef1 + ef2;

    while (ef2 <= limit)
    {

        long ef3 = 4 * ef2 + ef1;


        if (ef3 > limit)
            break;


        ef1 = ef2;
        ef2 = ef3;
        sum += ef2;
    }

    return(int) sum;
}


public static void main (String[] args) 
{
    int limit = 500;
    System.out.println(evenFibSum(limit));

}

这是我试图实现的目标:

    long startRange;, evenFib1;;
    long sum = startRange + evenFib1;

    if (startRange == 0)
    {
        startRange += 1;
    } 
    else if (startRange % 2 == 0)
    {
      evenFib1 + 2;
    }

2 个答案:

答案 0 :(得分:0)

如果生成斐波那契数的范围是0到n,则全部生成它们,并仅获取所需的那些。例如:

int []f = fibonacciNumbers(500); //suppose this gives you first 500 fibonacci numbers

如果您希望数字介于18至500之间,则可以使用数组的该部分。

int []f2 = new int[500-18];

for(int i=0; i<(500-18); i++){
   f2[i] = f[18+i];
}

答案 1 :(得分:0)

您的代码只需要检查ef2,就像您对limit那样:

long evenFibSumBetween(int start, int limit)
{
    if (limit < 2)
        return 0;

    long ef1 = 0, ef2 = 2;
    long sum = 0;
    if (start <= ef2)
        ef1 + ef2;

    while (ef2 <= limit)
    {  
        long ef3 = 4 * ef2 + ef1;
        if (ef3 > limit)
            break;
        ef1 = ef2;
        ef2 = ef3;
        if (start <= ef2)
            sum += ef2;
    }
    return sum;
}

但是,这与较慢的速度相同:

long evenFibSumBetween(int start, int limit) {
    return evenFibSub(limit) - evenFibSum(start - 1);
}