小弟有个程序,不知为什么改变数组大小,输入的数有的合适,能够得到结果,而有的却报错,报数组越界,不知为什么。
比如输入1 2 3 4 5时可以正确得到结果,如果输入
10 11 12 13 14 就会报错?为什么?是什么地方不对吗?希望各位可以解释一下,不胜感激!
/*题目:一个有序线性表,有n个数,任给一个x,找出线性表中的两个数使得这两个数的和是x。
 * 这里的线性表用数组表示
 * */
import java.io.*;public class Bsearch {
public static void main(String[] args) throws NumberFormatException, IOException  {
int size = 5;
int[] arr = new int[size];
System.out.println("请输入的一列数:");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
for(int i = 0;i<arr.length;i++)
{
int change = Integer.parseInt(br.readLine());
    arr[i]= change;
}
System.out.println("您输入的一组数是:");
for(int i = 0;i<arr.length;i++)
{
System.out.print(" "+arr[i]);
}
System.out.println(" ");
System.out.println("请任输入的一个数:");
BufferedReader brd = new BufferedReader(new InputStreamReader(System.in));
int x = Integer.parseInt(brd.readLine());
Search sh=new Search();
    int rest,j;
    for(int i = 0; i < arr.length; i++)
   {
  rest = x - arr[i];
  j = sh.search(arr, x, rest);
  if(j == -1) break;
  else
  System.out.println("第"+(i+1)+"个数和"+"第" +(j+1)+"个数的和是 "+x); 
  }
}
}
class Search
{
public int search(int []a,int n,int k)
{
int left = 0;
int right = n;
while(left<=right)
{
int middle=(left+right)/2;
if(k==a[middle])
return middle;
else if(k < a[middle])
{
right = middle-1;
}
else
{
left=middle+1;
}
}
return -1;
}
}

解决方案 »

  1.   

    不知道你的search方法用来做什么的,用二分法找一个值?这个思路很明显错的
    int left = 0;
    int right = n;
    int middle=(left+right)/2;
    一开始你的right就是要找的数
    你的数组长度就是5,随便输入一个数大于5*2,你的程序就要报错了.
    不相信就试试看...int middle=(0+5*2)/2;-->5,已经超出下标了...a[middle]就会报错了
      

  2.   


    search函数是要用二分法查找传进来的参数k,n是数组的长度,好像在定义right时应该是n-1,不是n。这个思路应该是没错的。
      

  3.   

    BufferedReader brd = new BufferedReader(new InputStreamReader(System.in));
    int x = Integer.parseInt(brd.readLine());
    Search sh=new Search(); 
    int rest,j;
    for(int i = 0; i < arr.length; i++)
    {
    rest = x - arr[i];
    j = sh.search(arr, x, rest);
    if(j == -1) break;
    else
    System.out.println("第"+(i+1)+"个数和"+"第" +(j+1)+"个数的和是 "+x); 
    }
    }明明是要查找的数啊,为什么说是数组的长度?再认真检查一下吧