首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Euler攻击项目#2

Euler攻击项目#2
EN

Code Review用户
提问于 2015-01-10 16:23:09
回答 2查看 202关注 0票数 5

这是我在欧拉#2项目中的C#实现。它需要0毫秒来运行,我相信这是正确的-我没有看到任何其他指示!

通过考虑Fibonacci序列中值不超过400万的项,找出偶数项的和。

代码语言:javascript
复制
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);
}

有什么事我应该做的不一样吗?

EN

回答 2

Code Review用户

回答已采纳

发布于 2015-01-10 16:40:22

你为什么需要斐波纳契数字的实际列表?这只需要空间和时间。

信不信由你,你考虑过这个问题了。此外,您的代码样式已关闭。

C#代码约定总是对单个语句块使用大括号,并且大括号应该在新行的开头打开。代码如下:

{ if (i %2 == 0) sumEvenFibos += i;}

应:

代码语言:javascript
复制
foreach (int i in fiboNums)
{
    if (i % 2 == 0)
    {
        sumEvenFibos += i;
    }
}

至于清单,你不需要它:

代码语言:javascript
复制
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),它变成:

代码语言:javascript
复制
static void Main(string[] args)
{
    Stopwatch s = new Stopwatch();
    s.Start();

    int sumEvenFibos = GetFiboSum(4000000);

    s.Stop();

    Console.WriteLine(sumEvenFibos);
    Console.WriteLine(s.ElapsedMilliseconds);
}
票数 6
EN

Code Review用户

发布于 2015-01-11 18:35:55

  1. 这是: List fiboNums =新的List();GetFibos(ref fiboNums,4000000);看起来像C++主义。在C#中,有值类型(struct)和引用类型(class)。List<T>是一个类,因此通过ref传递它不会获得任何结果,除非您想用另一个list对象替换list对象。如果GetFibos应该创建列表,那么填充它,然后返回它。
  2. GetFibos的名字可能更像GetFibonacciNumbers
  3. 正如@rolfl所指出的,您实际上不需要存储所有数字--您只需使用枚举器将它们生成为序列,然后对结果序列进行处理: public IEnumerable GetFibonacciNumbers(int max) { int current = 1;int <= = 0;while (current <= max) {产生返回电流;int tmp = current + current;then = current;current = tmp;}}现在您可以结合一些LINQ来计算所需的内容: var sumOfAllEven = GetFibonacciNumbers(4000000).Where(n => n%2 == 0).Sum();
票数 5
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/77181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档