我对使用C#进行编程非常陌生,并认为尝试欧拉问题作为一个起点基础是一个好主意。但是,我已经达到了一个问题,我似乎无法得到问题2的正确答案。
“Fibonacci序列中的每个新术语都是通过添加前两个术语生成的。从1和2开始,前10个术语将是:
1,2,3,5,8,13,21,34,55,89,......
通过考虑Fibonacci序列中的值不超过四百万的项,找到偶数项的总和。“
我的代码是:
int i = 1;
int j = 2;
int sum = 0;
while (i < 4000000)
{
if (i < j)
{
i += j;
if (i % 2 == 0)
{
sum += i;
}
}
else
{
j += i;
if (j % 2 == 0)
{
sum += j;
}
}
}
MessageBox.Show("The answer is " + sum);
基本上,我认为我只获得序列的最后两个偶数并添加它们 - 但我不知道如何获得序列的所有偶数并添加它们。有人可以帮助我,同时试图从我的起点进步吗?
P.S。 - 如果有任何非常糟糕的布局选择,请说现在消除这些将有助于我在未来成为更好的程序员:)
提前多多感谢。
答案 0 :(得分:2)
使用数组fib
存储序列。它更容易编码和调试。在每次迭代时,您只需要检查值是否均匀。
fib[i] = fib[i - 1] + fib[i - 2];
if (fib[i] > 4000000) break;
if (fib[i] % 2 == 0) sum += fib[i];
答案 1 :(得分:2)
您需要将sum的初始值设置为2,因为您不包括与当前代码的总和中的值。
此外,尽管内存使用效率可能较低,但我可能会编写类似这样的代码,因为IMO更具可读性:
var fibonacci = new List<int>();
fibonacci.Add(1);
fibonacci.Add(2);
var curIndex = 1;
while(fibonacci[curIndex] + fibonacci[curIndex - 1] <= 4000000) {
fibonacci.Add(fibonacci[curIndex] + fibonacci[curIndex - 1]);
curIndex++;
}
var sum = fibonacci.Where(x => x % 2 == 0).Sum();
答案 2 :(得分:2)
我刚刚登录我的Project Euler帐户,看到了正确的答案。正如其他人所说,你忘记添加初始术语2,但是否则你的代码没问题(正确的答案是你的代码输出+ 2),做得好!
但这很令人困惑,我认为如果你使用3个变量会更加清晰,例如:
int first = 1;
int second = 1;
int newTerm = 0;
int sum = 0;
while (newTerm <= 4000000)
{
newTerm = first + second;
if (newTerm % 2 == 0)
{
sum += newTerm;
}
first = second;
second = newTerm;
}
MessageBox.Show("The answer is " + sum);
答案 3 :(得分:0)
几年前我已经解决了这个问题,所以我不记得我是怎么做到的,但我确实可以访问论坛来讨论它。一些提示和一个彻头彻尾的解决方案。数字以一种模式重复。偶然的两个几率。所以你可以跳过数字而不必进行模数运算。
建议的C#解决方案是
long sum = 0, i0, i1 = 1, i2 = 2;
do
{
sum += i2;
for (int i = 0; i < 3; i++)
{
i0 = i1;
i1 = i2;
i2 = i1 + i0;
}
} while (i2 < 4000000);
答案 4 :(得分:0)
你的代码有点难看,因为你在i和j之间交替。有一种更简单的方法可以通过使用三个变量来计算斐波纳契数,并始终保持其含义相同。
一个相关的错误是你只检查每一次迭代和错误位置的结束条件。但是你很幸运,截止值适合你的bug(超过极限的数字很奇怪),所以这不是你的问题。
另一个错误是您使用<
而不是<=
进行检查,但由于没有等于截止值的斐波纳契数,这不会导致您的问题。
它也不是int溢出。
剩下的是你忘了查看序列的前两个元素。其中只有一个是偶数,因此您需要在结果中添加2
。
int sum = 0; => int sum = 2;
就个人而言,我会编写一个返回无限fibonacci序列的函数,然后用Linq过滤和求和。 Fibonacci().TakeWhile(i=> i<=4000000).Where(i=>i%2==0).Sum()
答案 5 :(得分:0)
我使用一个类来表示FibonacciNumber,我认为这使得代码更具可读性。
public class FibonacciNumber
{
private readonly int first;
private readonly int second;
public FibonacciNumber()
{
this.first = 0;
this.second = 1;
}
private FibonacciNumber(int first, int second)
{
this.first = first;
this.second = second;
}
public int Number
{
get { return first + second; }
}
public FibonacciNumber Next
{
get
{
return new FibonacciNumber(this.second, this.Number);
}
}
public bool IsMultipleOf2
{
get { return (this.Number % 2 == 0); }
}
}
也许这是一个太过分的步骤,但最终结果是一个功能,读得相当不错恕我直言:
var current = new FibonacciNumber();
var result = 0;
while (current.Number <= max)
{
if (current.IsMultipleOf2)
result += current.Number;
current = current.Next;
}
return result;
然而,它不会像其他解决方案那样有效,而不是在while循环中新建类。取决于你的要求我想,对我来说,我只是想解决问题并转到下一个。
答案 6 :(得分:0)
您好我已经解决了这个问题,检查一下是否正确。 我的代码是,
#include<iostream.h>
#include<conio.h>
class euler2
{
unsigned long long int a;
public:
void evensum();
};
void euler2::evensum()
{
a=4000000;
unsigned long long int i;
unsigned long long int u;
unsigned long long int initial=0;
unsigned long long int initial1=1;
unsigned long long int sum=0;
for(i=1;i<=a;i++)
{
u=initial+initial1;
initial=initial1;
initial1=u;
if(u%2==0)
{
sum=sum+u;
}
}
cout<<"sum of even fibonacci numbers upto 400000 is"<<sum;
}
void main()
{
euler2 a;
clrscr();
a.evensum();
getch();
}
答案 7 :(得分:0)
这是我的实施:
public static int evenFibonachi(int n)
{
int EvenSum = 2, firstElem = 1, SecondElem = 2, SumElem=0;
while (SumElem <= n)
{
swich(ref firstElem, ref SecondElem, ref SumElem);
if (SumElem % 2 == 0)
EvenSum += SumElem;
}
return EvenSum;
}
private static void swich(ref int firstElem, ref int secondElem, ref int SumElem)
{
int temp = firstElem;
firstElem = secondElem;
secondElem += temp;
SumElem = firstElem + secondElem;
}