项目欧拉- 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();
这是因为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的Range
和Where
方法:
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