似乎我的代码不适用于项目Euler,问题1。 问题是:
如果我们列出10以下的所有自然数,它们是3或3的倍数 5,我们得到3,5,6和9.这些倍数的总和是23。
查找低于1000的3或5的所有倍数的总和。
我的程序输出
266333
我的代码是:
private static final int max = 1000;
private static int sum;
public static void main(String[] args)
{
addMultiples(3);
addMultiples(5);
System.out.println(sum);
}
private static void addMultiples(int mult)
{
int x = mult;
while(x < max)
{
sum += x;
x += mult;
}
}
似乎数学的基本原理只是在逃避我,如果我无法找到解决这样一个简单问题的方法,这真的让我不能成为程序员。
答案 0 :(得分:6)
首先,最重要的是,不要气馁。它只是一个问题,它是一个非常糟糕的程序员潜力指标。只是继续练习,不管怎么说,你的错误比编程更重要。
如果我们列出3的倍数小于16的数字,我们得到:3,6,9,12,15。 如果我们列出5的倍数小于16的数字,我们得到:5,10,15。
看到问题?
你计算两次15次。你可以弄清楚实现,所以我不打算给你代码。那不会让你变得更好。
此外,通过数学和总结可以更有效地解决这个问题,但我会留给你。
答案 1 :(得分:2)
你在那里犯的错误是增加了3个和 5的倍数,比如15次两次。
public static void main(String[] args) {
long sum = 0;
for(int i = 0; i <= 1000; i++) if(i%3==0 || i%5==0) sum += i;
System.out.println(sum);
}
答案 2 :(得分:1)
这里有一个小错误。
15是5的倍数,也是3的倍数。所以你不想算那两次! :)
你可以做的一件事(这是我的功能方面)是创建一个从0到最大的列表。然后创建一个方法,取出所有3的倍数并将它们添加到结果列表中,并将它们从输入列表中删除。此现在已修剪的列表将传递给过滤掉所有5的倍数的方法,并将它们添加到同一输出列表中。
你拿下你的清单总和。
编辑:JohannesTrümpelmann的解决方案简短,易读且性能更佳,所以你可能想要使用那个......:)
答案 3 :(得分:1)
你的错误在于你没有考虑到你的分频器的乘法被计算两次。因此,我建议您更改addMultiples
以获取一系列分频器。如果它们划分某些数字,请检查循环内的分隔符。:
private static int sum;
public static void main(String[] args)
{
addMultiples(new int[]{3,5});
System.out.println(sum);
}
private static void addMultiples(int[] mult)
{
int x = 1;
while(x < max)
{
for(int i = 0; i < mult.length; i++){
if(x % mult[i] == 0){
sum += x;
break;
}
}
}
}