为什么我的项目euler 1的解决方案不起作用?

时间:2013-04-10 01:58:16

标签: java

我决定尝试一下这个小例子,就像显示的例子一样只有10个。

  

如果我们列出10以下的所有自然数是3或5的倍数,我们得到3,5,6和9。这些倍数的总和是23.

     

查找低于1000的3或5的所有倍数的总和。

public class project1 {

    public static void main(String[] args) {
        int three=0;
        int tot3=0;
        int five=0;
        int tot5=0;
        int total;

        while (tot3<10) {
            three+=3;
            tot3=tot3+three;
        };
        while (tot5<10) {
            five+=5;
            tot5=tot5+five;
        };

        total=tot3+tot5;

        System.out.println("Three's: " + tot3);
        System.out.println("Five's: " + tot5);
        System.out.println("Combined: " + total);
    }

}

我的输出显示为:

  

三个:18
  五:15   合并:33

7 个答案:

答案 0 :(得分:3)

3和5的倍数(例如15)的数字被计算两次 - 每次循环一次。

答案 1 :(得分:1)

while (tot3<10) {
        three+=3;
        tot3=tot3+three;
};

我认为你的意思是

while (tot3<10) {
        three += tot3; // Add this multiple of 3 to the total.
        tot3+=3;       // increment the "next multiple"
    }

(同样为5)

孤星也很重要 - 你需要在“5”循环中添加逻辑来检查它是否已经计入3循环中。 mod(%)运算符可以帮助那里。

答案 2 :(得分:1)

首先,

while (tot3<10) {
    three+=3;
    tot3=tot3+three;
};
while (tot5<10) {
    five+=5;
    tot5=tot5+five;
};

这应该是

while (three<10) {
    three+=3;
    tot3=tot3+three;
};
while (five<10) {
    five+=5;
    tot5=tot5+five;
};

因为您担心何时开始计算10以上的数字,而不是当这些数字的总数超过10时。

其次,您的解决方案将计算三次和五次的倍数。例如,15将被添加两次。了解模运算符%,以便为此提供解决方案(例如,如果five % 3 == 0,则不会向tot5计数中添加五个

答案 3 :(得分:1)

我建议使用模块化运算符来解决这个问题。在java%中将允许您执行模运算。例如,3的任何倍数,例如9%3 = 0而9%2 = 1.可以认为将第一个数除以第二个数后剩下的数。由该数字修改的数字的所有倍数将返回零。

答案 4 :(得分:1)

通过循环跟踪您的变量,您将看到问题: 对于tot3

  • = 3
  • = 9
  • = 18
  • = 30

您正在跟踪总和,而不是跟踪倍数。

部分解决了这个问题
  

而(3&LT; 10)

再一次,通过循环跟踪变量,你会发现这是错误的 - 它会在12处而不是9处停止。将其更改为

  

虽然(3&10 9)   //即限制之前的最后一个可分数,或者如果它可以被整除的那个限制(在5的情况下)

所有人都说,一个无限更优雅的解决方案将涉及模数和一个很好的小if语句。我希望这有帮助!

答案 5 :(得分:0)

public class project1 {

    public static void main(String[] args) {
        int number = 0;
        int total = 0;

        while (number < 10) {
            System.out.println(number);

            if ((number % 3) == 0) {
                System.out.println(number + " is a multiple of 3");
                total = total + number; 
            }
            else if ((number % 5) == 0) {
                System.out.println(number + " is a multiple of 5");
                total = total+number;   
            }
            number++;
        }
        System.out.println("total = "+ total);
    }
}

看看我有多慢,我和其他人做了大致相同的事情,但换成了模数函数。模数函数给出了将第一个数除以第二个数的余数(int),并且可以与另一个整数进行比较。在这里,我用它来检查当前数字是否可以被3或5直接整除,如果值为真,则将其加到总数中。

答案 6 :(得分:0)

Try this

import java.util.*;

public class Solution {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int t = in.nextInt();
        for(int a0 = 0; a0 < t; a0++){
            long n = in.nextLong()-1;
            System.out.println((n-n%3)*(n/3+1)/2 + (n-n%5)*(n/5+1)/2 - (n-n%15)*(n/15+1)/2);
        }
    }
}