-2

欧拉计划 - 问题 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();
4

7 回答 7

4

这是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;
    }
}

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

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

于 2013-06-03T18:00:32.373 回答
4

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

代替

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

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

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

于 2013-06-03T17:07:12.007 回答
3

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

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

于 2013-06-03T17:06:58.987 回答
3

您没有考虑同时是 35的倍数的数字

如果我是你,我会有类似下面的东西

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
}
于 2013-06-03T17:03:28.007 回答
2

正如其他人指出的那样,问题在于您的代码两次计算 15 的倍数。当然,这个任务使用 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();
于 2013-06-03T17:11:26.390 回答
1

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

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

numbers = numbers.Distinct().ToList();之前打电话numbers.ForEach(Console.WriteLine);

我认为问题在于,当我使用 foreach 写出列表值时,它从 705 而不是 3 开始,但我不知道为什么。

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

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

于 2013-06-03T17:09:20.770 回答
0

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

于 2013-06-03T17:13:04.200 回答