0

问题是 :

编写一个程序,读取一个数字 n,然后声明一个包含 n 个元素的数组。然后程序用前 n 个数字填充数组,其中每个数字都是前一个数字的 2 次方。最后,显示数组的内容。

我的代码:

import java.util.*;

public class Q1 {
  static Scanner scan = new Scanner (System.in);

  public static void main(String args [] ) {
    int num;
    int i = 0;
    System.out.println("Enter a number :");
    num = scan.nextInt();

    double [] a=new double[num];
    a[0]= num ;

    for ( ;i<=a.length-1 ; i++) {
      a[i+1] = Math.pow(2,a[i]);

      System.out.println((int)(a[i]) );
    }
  }
}

错误是:

   ----jGRASP exec: java Q1

Enter a number :
4
4
16
65536
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4
    at Q1.main(Q1.java:16)

 ----jGRASP wedge2: exit code for process is 1.

为什么这么说?并且用户的数字打印了两次!

4

8 回答 8

6
 a[i+1] = Math.pow(2,a[i]); // issue here

i=a.length-1i+1a.length。所以这个数组中没有索引值匹配。

建议:

创建一个数组女巫有lenght= a.length+1

double powArray[] =new double[a.length+1];

现在

powArray[0]=a[0];
for(int i=1;i<powArray.length;i++){
   powArray[i]=Math.pow(2,a[i-1]);
}
于 2013-11-12T09:34:09.693 回答
1

根据编译器,问题在第 16 行:a[i+1] = Math.pow(2,a[i]);问题是索引在这里没有正确匹配。所以它给出了 ArrayIndexOutOfBound Exception.Here i=a.length-1, i+1=a.length。所以它给出了 ArrayIndexOutOfBound 异常。

在访问数组项之前,您应该检查您的索引不是负数并且不高于数组长度。

请参考:避免索引越界异常

于 2013-11-12T09:42:01.993 回答
0

专注于您的代码的以下部分,它很容易,如果您自己弄清楚,您会感觉很好:

for ( ;i<=a.length-1 ; i++) // check from where i starts and where it ends
{
     a[i+1] = Math.pow(2,a[i]); // check what value of i would be here on each iteration    
     System.out.println((int)(a[i]) );
}

您也可以使用调试器并检查每次迭代

于 2013-11-12T09:47:00.593 回答
0

这里没什么可看的。

您已经写a[0]= num ;了这意味着数组中的第一个值与用户输入的数字相同。因此,您可以再次看到打印的数字。因此,

a[0] = 1; // initial value has to be 1, contrary to what you've used

接下来,需要修复生成数组值的循环。当您拥有i+1时,数组索引在最后一次迭代中超出范围,您的i is a.length - 1. 因此将您的循环更改为这样的

for (int i = 1; i < a.length; i++) {
    a[i] = Math.pow(2, a[i-1]);
}

现在,在单独的循环中打印数组值,因为前一个循环不会打印数组第一个索引的值。

for (int i = 0; i < a.length; i++) {
    System.out.println((int)a[i]);
}
于 2013-11-12T09:47:37.420 回答
0
import java.util.*;

public class Q1 {
  static Scanner scan = new Scanner (System.in);

  public static void main(String args [] ) {
    int num;
    int i = 0;
    System.out.println("Enter a number :");
    num = scan.nextInt();

    double [] a=new double[num];

    for ( ;i<a.length ; i++) {
      a[i] = Math.pow(2,i);

      System.out.pri``nt((int)a[i]+ " ");
    }
  }
}
于 2013-11-12T17:29:07.910 回答
0
        int num ;
        System.out.println("Enter a number :");
        num = scan.nextInt();
        double [] a=new double[num];
        a[0]= num ; //Assign First Element To Array
        double prev = a[0];
        for(int i=1;i<a.length;i++){
            a[i] = Math.pow(2,prev);
            prev = a[i];
        }
        for(int i=0;i<a.length;i++)
            System.out.println(a[i]);

输出

    Enter a number :
    3

    3.0
    8.0
    256.0
于 2013-11-12T09:50:43.600 回答
0

只需将循环更改为:

for(;i < a.length-1;i++)

因为当您将 4 指定为 a[] 的长度时..

你有 a[0],a[1],a[2],a[3]... 4 个插槽。

现在 a.length 给出 4。

所以对于你的 a[i+1] for i=a.length-1 (即 3 ).. a[i+1] = a[4]... 这超出了你的数组绑定的数组。

于 2013-11-12T09:50:54.727 回答
0

将上限更改为 a.length-2 .Rest 代码保持不变

import java.util.*;

public class Q1 {
  static Scanner scan = new Scanner (System.in);

  public static void main(String args [] ) {
    int num;
    int i = 0;
    System.out.println("Enter a number :");
    num = scan.nextInt();

    double [] a=new double[num];
    a[0]= num ;

    for ( ;i<=a.length-2 ; i++) {
      a[i+1] = Math.pow(2,a[i]);

      System.out.println((int)(a[i]) );
    }
  }
}
于 2013-11-12T09:49:56.130 回答