在'if'循环中使用数组有问题吗?

时间:2013-06-05 01:53:06

标签: java

在接受挑战的同时,我在网上发现程序员要找到1000和1000之下的所有倍数的总和,我遇到了一个问题。这是我的代码:

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) {

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

3 个答案:

答案 0 :(得分: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.

答案 1 :(得分:1)

问题是你在谈论的那一行有一个ArrayIndexOutOfBoundsException

我的电脑上有完整的例外

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

第25行:

if(multiples5[counter] >= 1000) {

这告诉您,您尝试索引点1000.但是对于multiples5,1000不是有效索引,因为其长度为1000.有效索引范围仅为0到999.

计数器命中1000的原因是,在while循环的最后一次迭代中,计数器从999开始,然后你将它增加到1000.然后从那一点开始每次尝试索引数组时都会得到一个IndexOutOfBoundsException。

  while(counter < 1000) {
      ...
      counter++;
      ...
      if(multiples5[counter] >= 1000) {

答案 2 :(得分:0)

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

即。总和是

n

BTW它是3或5的倍数的值的总和,而不是3的前1000个倍数的总和加上前5个倍数的总和5.这也将两个数字相加。

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