项目欧拉,#1

时间:2014-01-20 04:35:31

标签: java math logic

似乎我的代码不适用于项目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;
        }
    }

似乎数学的基本原理只是在逃避我,如果我无法找到解决这样一个简单问题的方法,这真的让我不能成为程序员。

4 个答案:

答案 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;
            }
        }
    }
}