-3

当我在网上找到一个挑战,让程序员找到 1000 以下的所有 3 和 5 的倍数之和时,我遇到了一个问题。这是我的代码:

public class Challenge {

    public static int i = 0;
    public static int counter = 0;
    public static int sum = 0;
    public static int[] multiples3;
    public static int[] multiples5;

    public static void main(String args[]) throws Exception {

        multiples3 = new int[1000];
        multiples5 = new int[1000];

        while(counter < 1000) {

            multiples3[counter] = 3*counter;
            multiples5[counter] = 5*counter;

            System.out.println("Adding: " + sum + ", " + multiples5[counter] + ", and " + multiples3[counter]);
            sum = sum + (multiples5[counter] + multiples3[counter]);
            counter++;

            System.out.println("Progressive Sum: " + sum + "\n" + "____________");

            if(multiples5[counter] >= 1000) {
                System.out.println("++++ FIVES DONE ++++");

                while(multiples3[counter] <= 999) {

                    sum = (sum + multiples3[counter]);
                    counter++;

                    System.out.println("Progressive Sum: " + sum + "\n" + "____________");

                    if(multiples3[counter] >= 999) {
                        System.out.println("~~~~~~ DONE ~~~~\n Final result: " + sum);
                    }
                }
            }               
        }
    }
}

我在这一行得到一个错误:if(multiples5[counter] >= 1000) {

我假设它与我尝试使用数组有关,但我不完全确定,因为我是数组新手。另外,我是否以正确的方式应对这一挑战?我在这里先向您的帮助表示感谢!

4

3 回答 3

3

您面临的错误是ArrayOutOfBoundsException. 观看counter

while(counter < 1000) {                  counter is 999

    // your code here                    
    counter++;                           counter + 1 => 1000
    // your code here   
    if(multiples5[counter] >= 1000) {    multiples5 doesn't have 1000th index.
于 2013-06-05T02:06:00.843 回答
1

问题是你有一个ArrayIndexOutOfBoundsException你正在谈论的线路。

我电脑上的完整例外是

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1000
    at Challenge.main(Challenge.java:25)

第 25 行:

if(multiples5[counter] >= 1000) {

这告诉您您尝试索引点 1000。但是multiples51000 不是有效索引,因为它的长度为 1000。有效索引范围仅从 0 到 999。

计数器达到 1000 的原因是,在 while 循环计数器的最后一次迭代中,计数器从 999 开始,但随后将其增加到 1000。然后从该点开始,每次尝试索引数组时,都会得到 IndexOutOfBoundsException。

  while(counter < 1000) {
      ...
      counter++;
      ...
      if(multiples5[counter] >= 1000) {
于 2013-06-05T02:05:25.780 回答
0

如果 3 或 5 的倍数是样本的总和,则作为所有 3 的总和 + 所有 5 的总和 - 3 * 5 的总和(否则它们将被计算两次。要计算倍数的总和,您可以使用倍数m * n * (n + 1) / 2所在的公式是这些元素的数量mn

即总和是

int sum = 3 * (1000 / 3) * (1000 / 3 + 1) / 2 
        + 5 * (1000 / 5) * (1000 / 5 + 1) / 2
        - 15 * (1000 / 15) * (1000 / 15 + 1) / 2;

顺便说一句,它是 3 或 5 的倍数的值的总和,而不是前 1000 个 3 的倍数之和加上前 1000 个 5 的倍数之和。这也会将一些数字相加两倍。

所以你不需要循环或数组。注意:许多这类谜题都是非常数学而非编程的谜题。

于 2013-06-05T06:10:19.000 回答