这是我在欧拉#2项目中的C#实现。它需要0毫秒来运行,我相信这是正确的-我没有看到任何其他指示!
通过考虑Fibonacci序列中值不超过400万的项,找出偶数项的和。
static void GetFibos(ref List<int> nums, int maxVal)
{
nums.Add(1);
int lastNum = 2;
while (lastNum <= maxVal)
{
nums.Add(lastNum);
lastNum = nums[nums.Count - 2] + nums[nums.Count - 1];
}
}
static void Main(string[] args)
{
Stopwatch s = new Stopwatch();
s.Start();
List<int> fiboNums = new List<int>();
GetFibos(ref fiboNums, 4000000);
int sumEvenFibos = 0;
foreach (int i in fiboNums) { if (i % 2 == 0) sumEvenFibos += i; }
s.Stop();
Console.WriteLine(sumEvenFibos);
Console.WriteLine(s.ElapsedMilliseconds);
}有什么事我应该做的不一样吗?
发布于 2015-01-10 16:40:22
你为什么需要斐波纳契数字的实际列表?这只需要空间和时间。
信不信由你,你考虑过这个问题了。此外,您的代码样式已关闭。
C#代码约定总是对单个语句块使用大括号,并且大括号应该在新行的开头打开。代码如下:
{ if (i %2 == 0) sumEvenFibos += i;}
应:
foreach (int i in fiboNums)
{
if (i % 2 == 0)
{
sumEvenFibos += i;
}
}至于清单,你不需要它:
int current = 1;
int previous = 0;
int sum = 0;
while (current <= 4000000)
{
if ((current % 2) == 0)
{
sum += current;
}
int tmp = current + previous;
previous = current;
current = tmp;
}现在,这整件事应该放在它自己的函数中,您的主要方法有一个上限参数(4,000,000),它变成:
static void Main(string[] args)
{
Stopwatch s = new Stopwatch();
s.Start();
int sumEvenFibos = GetFiboSum(4000000);
s.Stop();
Console.WriteLine(sumEvenFibos);
Console.WriteLine(s.ElapsedMilliseconds);
}发布于 2015-01-11 18:35:55
struct)和引用类型(class)。List<T>是一个类,因此通过ref传递它不会获得任何结果,除非您想用另一个list对象替换list对象。如果GetFibos应该创建列表,那么填充它,然后返回它。GetFibos的名字可能更像GetFibonacciNumbers。https://codereview.stackexchange.com/questions/77181
复制相似问题