项目欧拉 - 问题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();
答案 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的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();
答案 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
。