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

本文关键字:项目 | 更新日期: 2023-09-27 18:16:37

Project Euler - Problem 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();

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

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

代替

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

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

,它将工作,因为HashSet不允许重复的值

这是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上创建一个帐户,输入答案,并阅读问题概述

您没有考虑同时是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
}

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

从数字3开始,只是不可见

正如其他人指出的那样,问题在于您的代码将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();

列表中有重复的值。这就是总和无效的原因。你最好把数据结构改成不允许重复的HashSet。

如果你不能这样做,或者你必须这样做,试着在

下面

numbers.ForEach(Console.WriteLine);之前调用numbers = numbers.Distinct().ToList();

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

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

try Console.WriteLine(string.Join(",", numbers));

你也可以用Linq来解决。使用Enumerable.Range获取0到999(包括)之间的所有数字。然后使用Where将可被3 整除或可被5整除的过滤掉。最后使用Sum