项目欧拉 - 1:找到3和5的倍数

时间:2013-06-03 17:01:30

标签: c#

项目欧拉 - 问题1:求出低于1000的所有3或5的倍数之和。

在这里查看有关同一问题的问题,我假设我试图解决的方式非常糟糕。解决这个问题的最佳方法是什么?

我的另一个问题:总和值与答案不符。我认为问题在于,当我使用foreach写出列表值时,它从705而不是3开始,但我不知道为什么。如果有人能向我解释,我将不胜感激。

这是我现在使用的代码:

List<int> numbers = new List<int>();
for (int i = 3; i < 1000; i += 3)
{
    numbers.Add(i);
}
for (int j = 5; j < 1000; j += 5)
{
    numbers.Add(j);
}
numbers.ForEach(Console.WriteLine);
int sum1 = numbers.Sum();
Console.WriteLine(sum1);
Console.ReadLine();

7 个答案:

答案 0 :(得分:4)

这是因为numbers允许重复。请注意,您将有一些重复项,例如,数字15,30,45等将被添加两次。

替换

List<int> numbers = new List<int>();

ISet<int> numbers = new HashSet<int>();

它会起作用,因为HashSet不允许重复值。

答案 1 :(得分:3)

你没有考虑3个 5的倍数的数字

如果我是你,我会有类似以下的内容

for(int i=1; i<1000; i++)
{
    if(i is a multiple of 15)
        //account for 15
    else if(i is a multiple of 3)
        //account for 3
    else if(i is a multiple of 5)
        //account for 5
}

答案 2 :(得分:3)

输出以705开头的原因是因为您的数字列表很长(确切地说是532个数字)。您的控制台窗口在开始滚动之前只能包含几行。

所以你从数字3开始,它只是不可见。

答案 3 :(得分:3)

这是Project Euler上的第一个问题。

就个人而言,我使用了一个班轮:

Enumerable.Range(0, 1000).Where(n => n % 3 == 0 || n % 5 == 0).Sum()

但是你也可以使用很长的路来获得更多的可读性:

int sum = 0;
for (int i = 0; i < 1000; i++)
{
    if ((i % 3 == 0) || (i % 5 == 0))
    {
        sum = sum + i;
    }
}

如果您不知道模数(%)运算符的工作原理,建议您阅读here

如果您需要有关问题本身的更多详细信息,只需在Project Euler上创建一个帐户,输入答案,然后阅读Problem Overview

答案 4 :(得分:2)

正如其他人所指出的那样,问题是你的代码计算两倍的倍数。当然,使用Linq的RangeWhere方法可以轻松完成此任务:

var numbers = Enumerable.Range(0, 1000)
                        .Where(n => n % 3 == 0 || n % 5 == 0);
foreach(var n in numbers)
{
    Console.WriteLine(n);
}

var sum = numbers.Sum();
Console.WriteLine(sum);
Console.ReadLine();

答案 5 :(得分:1)

列表中有重复的值。这就是为什么总和是无效的。您最好将数据结构更改为HashSet,这不允许重复。

如果您不能这样做,或者您必须以这种方式继续,请尝试以下

numbers = numbers.Distinct().ToList();

之前致电numbers.ForEach(Console.WriteLine);
  

我认为问题是当我使用foreach写出列表时   价值从705而不是3开始,但我不明白为什么。

问题是重复值,foreach会正确打印,但您可能无法将控制台滚动到打印开始。

尝试Console.WriteLine(string.Join(",", numbers));

答案 6 :(得分:0)

您也可以使用Linq解决它。使用Enumerable.Range获取0到999(含)之间的所有数字。然后使用Where过滤那些可以被3 整除的内容或可被5整除。最后使用Sum