项目欧拉问题2。
Fibonacci序列中的每个新术语都是通过添加前两个术语生成的。从1和2开始,前10个术语将是:
1,2,3,5,8,13,21,34,55,89,......
通过考虑Fibonacci序列中的值不超过四百万的项,找到偶数项的总和。
我的解决方案:
int firstNum = 1;
int secondNum = 2;
int resultNum = firstNum + secondNum;
int sum = 0;
for (int i = 0; i < 4000000; i++)
{
firstNum = i;
secondNum = i;
if(resultNum == firstNum + secondNum)
{
sum += resultNum;
Console.WriteLine(sum);
}
}
为什么这不正确,你能引导我进入正确的思维方式吗?
答案 0 :(得分:1)
斐波纳契系列定义为
0 = 1, 1 = 1
n = A n-1 + A n-2
您的目标是制作模式
1 2 3 5 8 13等
在迭代时,您将要调整输入类似于滑动窗口,然后检查您是否遇到了有效插入(即<4M甚至是
)int sum = 0;
int max = 4000000;
for( int n = 0; n < max ; n++ )
{
//only sum the even numbers
if( second % 2 == 0 ) sum += second;
//adjust
int result = first + second;
first = second;
second = result;
//test for numbers greater than max
if( result > max ) break;
}
//output
Console.WriteLine(sum); //An for all even An values
希望你能看到一些你遇到的问题。
您正在将变量设置为迭代器i
,它不会按照定义生成A n ,而是完全不同的东西。
firstNum = i;
secondNum = i;
此外,您只计算一次结果。这需要在循环中完成。只计算一次基本上会在整个时间内使用静态值。
int resultNum = firstNum + secondNum;
条件语句应该测试偶数以便正确地添加到总和,但是这段代码只会测试resultNum
的静态值
if(resultNum == firstNum + secondNum)
此外,需要对总和进行一些检查,以便在超过最大值时突破。 4M迭代将太多。
虽然可以在这里进行更多优化。看看for循环,很明显,虽然还没有使用,迭代器可以是一个强大的工具。
原因是斐波那契符合“黄金比例”。
通过简单观察斐波那契数列经历了3次迭代的偶数次数,可以使用迭代器跳过该系列。
double p = (1 + Math.Pow(5,.5)) / 2;
for( int n = 3, sum = 0;;n+=3)
{
double f = ( Math.Pow(p,n) - Math.Pow( 1 - p , n ) ) / Math.Pow(5,.5);
if( f > 4000000 ){
Console.WriteLine(sum);
break;
}
sum += (int)Math.Round(f);
}
答案 1 :(得分:1)
试试这个:
int n1, n2, fib;
//n1 = 0;
//n2 = 1;
n1 = 1;
n2 = 1;
fib = n1 + n2;
while (fib < 4000000)
{
n2 = n1;
n1 = fib;
fib = n1 + n2;
}
然后找到偶数纤维数并总结
答案 2 :(得分:1)
对于更模块化的方法(与LINQ混合使用):
IEnumerable<Int32> Fibonacci(Int32 limit = 4000000)
{
for (Int32 previous = 0, current = 1, next = 0;
current <= limit; current = next)
{
next = previous + current;
previous = current;
yield return next;
}
}
然后:
var allNumbers = Fibonacci(4000000); // 1,2,3,5,8,13,21
var evenNumbers = allNumbers.Where(x => x % 2 == 0); // 2,8,34,144,610,2584
var sum = evenNumbers.Sum(); // 4613732
答案 3 :(得分:-2)
您的代码不会生成Fibonacci序列,也不会检查偶数值的术语
试试这个
int firstNum = 1;
int secondNum = 2;
int sum = 0;
while (secondNum <= 4000000)
{
if (secondNum % 2 == 0)
sum += secondNum;
int resultNum = firstNum + secondNum;
firstNum = secondNum;
secondNum = resultNum;
}
Console.WriteLine(sum);