A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王永旺 中级黑马   /  2012-4-4 09:41  /  2070 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王永旺 于 2012-4-4 10:48 编辑

下面今天练习数组的折半查找的时候编的程序,我想问我在查找数的时候,这个数字填07就可以通过,填08就会编译错误。显示“过大的整数”我如果就是想通过输入08,该如何实现呢。
/**
@author 旺旺
需求:  1 遍历数组
        2折半查找 while实现
*/
public class ArrayDemo
{
        public static void main(String[] args)
        {
                int[] arr = {1,2,4,6,8,34,67,98,123,454};
                int index = getIndex(arr ,-1);
                int index1=  halfSearch(arr ,08);//为什么这个数字填07就可以通过,填08就会编译错误。
                System.out.println("index="+index);
                System.out.println("index1="+index1);
        }
               
        public static int getIndex(int[] arr,int key)
        {
                for(int i=0;i<arr.length-1;i++)
                {
                        if(arr==key)
                        {
                                return i;
                        }
                }
                return -1;
        }

        public static int halfSearch(int[] arr,int key)
        {
                int min=0,max=arr.length,mid;
                while(min<=max)
                {
                        mid=(min+max)/2;
                        if(arr[mid]<key)
                        {
                                min=mid+1;
                        }
                        else if(arr[mid]>key)
                        {
                                max=mid-1;
                        }
                        else
                                return mid;
                }
                return -1;
        }
}

9 个回复

倒序浏览
本帖最后由 李敏 于 2012-4-4 11:29 编辑

  public static void main(String[] args)
        {
                int[] arr = {1,2,4,6,8,34,67,98,123,454};
                int index = getIndex(arr ,-1);
                int index1=  halfSearch(arr ,08);//为什么这个数字填07就可以通过,填08就会编译错误。-------------以0 开头的是八进制。
                System.out.println("index="+index);
                System.out.println("index1="+index1);
        }
               
        public static int getIndex(int[] arr,int key)
        {
                for(int i=0;i<arr.length-1;i++)
                {
                        if(arr==key)//---------------------if(arr [ i ] ==key)刚才弄成 i 了。
                        {
                                return i;
                        }
                }
                return -1;
        }
回复 使用道具 举报
八进制的8 是010,你突然出现个08,当然过大。
回复 使用道具 举报
  public static int getIndex(int[] arr,int key)
         {
                 for(int i=0;i<arr.length-1;i++)
                 {
                         if(arr==key)
                         {
                                 return i;
                         }
                 }
                 return -1;
         }
这里应该也是编译不过的吧, if(arr==key)应该是写成 if(arr[i]==key)这样
回复 使用道具 举报
十进制: 直接写阿拉伯数字。。。。。。。。。八进制: 以0开头。。。。。。。。。。。十六进制: 以0x开头。。。。。。。08.。是八进制数。。最大只能到七。。。逢八进一。。
回复 使用道具 举报
08不属于int类型数值,所以会说该类型超出范围 08是字符串 要用string 数组,
int 是整数型 ,如果你想最好把0去了
回复 使用道具 举报
你下面引用的折半查找功能函数中key可以使任意进制的任意数,而你输入了07证明次数是8进制中的7,系统转换为10进制后在你的数组中找不到这个数从而返回-1;但你输入的08,8进制是不存在的,8进制每位最高位为7.
另,你有一行打错了;见线面//
public class ArrayDemo
{        
        public static void main(String[] args)
        {
                int[] arr = {1,2,4,6,8,34,67,98,123,454};
                int index = getIndex(arr ,-1);
                int index1=  halfSearch(arr ,07);//为什么这个数字填07就可以通过,填08就会编译错误。
                System.out.println("index="+index);
                System.out.println("index1="+index1);
        }
               
        public static int getIndex(int[] arr,int key)
        {
                for(int i=0;i<arr.length-1;i++)
                {
                        if(arr==key)               //arr==key 这是查找key是否与arr中的元素相同
                        {
                                return i;
                        }
                }
                return -1;
        }

        public static int halfSearch(int[] arr,int key)
        {
                int min=0,max=arr.length,mid;
                while(min<=max)
                {
                        mid=(min+max)/2;
                        if(arr[mid]<key)
                        {
                                min=mid+1;
                        }
                        else if(arr[mid]>key)
                        {
                                max=mid-1;
                        }
                        else
                                return mid;
                }
                return -1;
        }
}

这样把08改为34或者其他的就会得到相应的角标;希望对你有帮助
回复 使用道具 举报
08以0开头说明是八进制,在八进制中最大的基本数是7跟十进制中最大的数是9一样。所以你写成08是不正确的,正常的是010.还有你程序中   if(arr==key)   这句是错误的 。arr是存储的是一个指向数组物理存储位置的值。key是一个int类型 的所以不能进行比较,而且比较也没什么意义。
回复 使用道具 举报
谢谢大家,把八进制这茬给忘了。知道了
回复 使用道具 举报
简单来说 08不属于int型。08本来就是个错误。0开头为八进制,八进制逢8进1。书写08,09,本来就是个错误。如果要这样书写只能作为字符串。String。
可以简单测试下
int s1=07;
int s2=08;  //String s2="08";
s.o.p(s1+"+"+s2);
编译还是过大的整数。//隐去s2 后编译通过 如果硬要输出的话,只能放入String 类型变量中.

另外楼主代码中    if(arr==key)
arr 是数组 ==key 一个int 数  显然和08,09输入一样。是个错误。。 数组和数字式没可比性的。
需改: if(arr[i]==key)
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马