此代码在起始值为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;
}
答案 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);
}