CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Java >  J2SE / 基础类

哪位达人帮忙看看这个程序错在哪里了!(50分求解)

楼主zhouyong80(老怪)2005-03-03 01:47:32 在 Java / J2SE / 基础类 提问

代码如下,编译运行都没有问题,就是不出结果。。。  
   
  import   java.io.*;  
   
  /**  
    *   对100个随机浮点数排序,然后交互的让用户输入一个数  
    *   打印出数组中离这个数最近的大数和小数  
    *   使用二分查找法。  
  **/  
   
  public   class   SortNumbers  
  {  
  public   static   double[]   sort(double[]   num)  
  {  
  //循环每一个元素,每次循环找到数组中未排序的元素  
  //中最小的一个,把它移动到最前面  
  for   (int   i=0;i<num.length;i++)  
  {  
  int   min=i; //保存最小元素的索引号  
  //查找i到数组最后一个元素中最小的元素  
  for   (int   j=i;j<num.length;j++)  
  {  
  if   (num[j]<num[min])  
  min=j;  
  }  
  //将i与最小元素交换  
  //这样就排序成功了  
  double   tmp;  
  tmp=num[i];  
  num[i]=num[min];  
  num[min]=tmp;  
   
  }  
  return   num;  
  }  
   
  public   static   void   search(double   d,double[]   num)  
  {  
  int   low=0;  
  int   middle;  
  int   middle1;  
  int   high=num.length-1;  
  double   key=d;  
   
  while   (low<=high)  
  {  
  middle=(low+high)/2;  
  if   (key==Math.ceil(num[middle]))  
  {  
  System.out.println(num[middle]);  
  middle1=middle+1;  
  System.out.println(num[middle1]);  
  break;  
  }  
  else   if   (key<Math.ceil(num[middle]))  
  high=middle-1;  
  else  
  low=middle+1;  
   
  }  
  }  
   
  public   static   void   main(String[]   args)   throws   IOException  
  {  
  BufferedReader   in   =   new   BufferedReader(new   InputStreamReader(System.in));  
   
  double[]   num=new   double[100];  
  for   (int   i=0;i<num.length;i++)  
  {  
  num[i]=Math.random()*1000;  
  }  
  num=sort(num);  
  for   (int   i=0;i<num.length;i++)  
  {  
  System.out.print(num[i]+"   ");  
  }  
  System.out.println();  
  for   (;;)  
  {  
  System.out.print("num>");  
  String   line=in.readLine();  
  if   ((line==null)||(line.equals("quit")))  
  break;  
  try  
  {  
  double   d=Double.parseDouble(line);  
  search(d,num);  
  }  
  catch   (Exception   e)  
  {  
  System.out.println("Invalid   Input");  
  }  
   
  }  
   
  }  
  } 问题点数:50、回复次数:20Top

1 楼zhouyong80(老怪)回复于 2005-03-03 03:21:42 得分 0

自己顶一下,哪位达人帮帮忙指点一下啊。我实在是找不到原因了。我是个菜鸟。。。。。。。Top

2 楼liuchunjp()回复于 2005-03-03 09:22:45 得分 5

二分查找算法有问题Top

3 楼rower203(华仔)回复于 2005-03-03 10:14:58 得分 20

修改一下search()方法:  
   
  public   static   void   search(double   d,double[]   num)  
  {  
  int   low=0;  
  int   middle=0;  
  int   middle1=0;  
  int   high=num.length;  
  double   key=d;  
  int   exitFlag   =   0;  
   
  while   (low<=high)  
  {  
  middle=(low+high)/2;  
  if   (exitFlag   ==   middle){  
  break;  
  }  
  exitFlag   =   middle;  
  if   (key<=num[middle])  
  high=middle;  
  else  
  low=middle;  
   
  }  
  System.out.println(num[middle]);  
  middle1=middle+1;  
  System.out.println(num[middle1]);  
  }  
  Top

4 楼liuchunjp()回复于 2005-03-03 10:21:52 得分 5

帮你改了一下方法,不过是用递归实现的  
   
  public   static   void   search(  
  double   d,  
  double[]   num,  
  int   Maxlength,//数组的长度  
  int   Minlength)   {  
  int   m   =   (Maxlength   +   Minlength)   /   2;  
  if   (Minlength   >   Maxlength)  
    {  
  System.out.println(num[m]   +   ","   +   num[m   +   1]);  
  return;  
    }    
        else    
        if   (d   ==   Math.ceil(num[m]))  
        {  
  System.out.println(num[m]   +   ","   +   num[m   +   1]);  
        }  
              else    
              if   (d   >   num[m])    
                    {  
                    search(d,num,Maxlength,   m   +   1   );  
                    }    
                        else  
                search(d,num,   m   -   1,Minlength);  
   
   
  }  
  Top

5 楼zhouyong80(老怪)回复于 2005-03-03 10:38:21 得分 0

rower203(华仔):  
  int   high=num.length         这样会不会下标越界啊?  
   
  这个程序是找出和用户输入相似的两个数,数组是随机产生的浮点数。我就没明白如何去进行一个比较,我想是不是要用到Math.ceil这样的方法啊????Top

6 楼rower203(华仔)回复于 2005-03-03 11:07:46 得分 0

high   是用在middle=(low+high)/2;  
  middle作下标不会越界。  
   
  你原先就错在判断比较何时结束上:if   (key==Math.ceil(num[middle]))很难恰好满足,也就无打印结果。  
  我这里是二分查找法,查到无法再分了,也就比较结束了,所以加了:  
  if   (exitFlag   ==   middle){  
  break;  
  }  
  Top

7 楼zhouyong80(老怪)回复于 2005-03-03 12:09:21 得分 0

哦,那还有一个问题,就是怎样比较两个浮点数的?就是说怎样确定这个浮点数和哪个相近。。。  
  比如我产生的数有13.1214478,13.1214300,13.1215112然后用户输入13.0怎样才能比较出来呢???  
   
  还要谢谢你前面的解答。。。。。。。。Top

8 楼bigc2000(公元2005年4月9日)回复于 2005-03-03 12:12:43 得分 3

这与C里面一样,取差的绝对值即可,Top

9 楼zhouyong80(老怪)回复于 2005-03-03 12:46:28 得分 0

差的绝对值可以比较两个数相等不相等,那怎样看最近似那一个呢??/Top

10 楼yiyo2025(HenryKong)回复于 2005-03-03 13:56:26 得分 3

差的绝对值越小的越近似啊Top

11 楼zhouyong80(老怪)回复于 2005-03-03 14:16:15 得分 0

如果结合我的这道题应该如何操作呢?????Top

12 楼monkeyK(影子星)回复于 2005-03-03 15:12:39 得分 6

有没有想过一种情况是:输入数字为4,随机数中升序有:3.1、4.1、4.2。  
  这个时候结果就不是4的前一个跟后一个了。  
  是否考虑将数组先减4取绝对,然后找最小的两个位置。  
  public   void   search(double[]   numX)  
  {  
  //循环每一个元素,每次循环找到数组中未排序的元素  
  //中最小的一个,把它移动到最前面  
  int   min=0; //保存最小元素的索引号  
                                      int   min2;  
  //查找i到数组最后一个元素中最小的元素  
  for   (int   j=0;j<numX.length;j++)  
  {  
  if   (numX[j]<numX[min])  
  min=j;  
  }  
  if((numX[min-1]-numX[nim])<(numX[min+1]-numX[nim]))  
          nim2=nim-1;  
                                      else  
                                              nim2=nim+1;  
                    System.out.println(num[nim]);  
                    System.out.println(num[nim2]);  
  }  
  Top

13 楼monkeyK(影子星)回复于 2005-03-03 15:35:34 得分 0

上面的numX是已经减过4的数组,num是排序后的数组。Top

14 楼rower203(华仔)回复于 2005-03-03 15:41:57 得分 0

在search()方法的最后加上一句就可以了:  
  public   static   void   search(double   d,double[]   num)  
  {  
  int   low=0;  
  int   middle=0;  
  int   middle1=0;  
  int   high=num.length;  
  double   key=d;  
  int   exitFlag   =   0;  
   
  while   (low<=high)  
  {  
  middle=(low+high)/2;  
  if   (exitFlag   ==   middle){  
  break;  
  }  
  exitFlag   =   middle;  
  if   (key<=num[middle])  
  high=middle;  
  else  
  low=middle;  
   
  }  
  System.out.println(num[middle]);  
  middle1=middle+1;  
  System.out.println(num[middle1]);  
  System.out.println("The   data   I   wanted   is:   "   +   ((d-num[middle])   >   (num[middle1]   -   d)?   num[middle1]:   num[middle]));  
  }Top

15 楼zhouyong80(老怪)回复于 2005-03-03 16:46:42 得分 0

monkeyK(影子星)   说得对,我后来也想了这个问题。确实应该减完了以后再比较。不过有一点,一个排好序的数组的每个元素减去同一个数不需要再排序了吧!那现在的问题就归结成了一个如何在减完后的数组中去寻找那个最接近于0的数。。。。。。  
   
  不知道我这样的想法是否正确。。。。。。。。Top

16 楼zhouyong80(老怪)回复于 2005-03-03 18:12:47 得分 0

我自己顶一下。。。。Top

17 楼yjh133(哈哈)回复于 2005-03-03 18:30:26 得分 8

monkeyK(影子星)   说得对!  
   
  我觉得先对num升序排序,然后比较num[0],num[num.length-1]同Key的大小  
  如果num[0]>Key,则num[0]为离Key最近的大数,无离Key最近的小数。  
  如果num[num.length-1]<Key,则num[length-1]为离Key最近的小数,无离Key最近的大数。  
   
  再二分查找到num[middle]   (rower203(华仔):的方法不错),然后讨论num[middle]是比Key大还是小。就可确定另一个离Key最近的数是num[middle-1]还是num[middle+1];  
   
  不知道想法对不对,望指正!  
  Top

18 楼zhouyong80(老怪)回复于 2005-03-03 18:58:59 得分 0

在综合大家的意见后我重新改了程序,但我发现在进行两个浮点数的比较的过程中出现了问题。无论我输入什么数字都会让循环进行到最后,没有进入我想象的分支。。。。。请大家帮忙指点一下关于浮点数的比较问题。。。  
   
  代码如下  
  import   java.io.*;  
   
  /**  
    *   对100个随机浮点数排序,然后交互的让用户输入一个数  
    *   打印出数组中离这个数最近的大数和小数  
    *   使用二分查找法。  
  **/  
   
  public   class   SortNumbers  
  {  
  public   static   double[]   sort(double[]   num)  
  {  
  //循环每一个元素,每次循环找到数组中未排序的元素  
  //中最小的一个,把它移动到最前面  
  for   (int   i=0;i<num.length;i++)  
  {  
  int   min=i; //保存最小元素的索引号  
  //查找i到数组最后一个元素中最小的元素  
  for   (int   j=i;j<num.length;j++)  
  {  
  if   (num[j]<num[min])  
  min=j;  
  }  
  //将i与最小元素交换  
  //这样就排序成功了  
  double   tmp;  
  tmp=num[i];  
  num[i]=num[min];  
  num[min]=tmp;  
   
  }  
  return   num;  
  }  
   
  public   static   void   search(double   d,double[]   num)  
  {  
  int   low=0;  
  int   high=num.length-1;  
  int   middle=0;  
  int   middle1=0;  
  int   middle2=0;  
  boolean   key=true;  
  while(low<=high)  
  {  
  if   (d<num[0])  
  {  
  System.out.println("输入的数是数组中最小的一个");  
  break;  
  }  
  if   (d>num[num.length-1])  
  {  
  System.out.println("输入的数是数组中最大的一个");  
  break;  
  }  
   
  middle=(low+high)/2;  
  middle1=middle+1;  
  middle2=middle-1;  
  if   ((num[middle]-d)>0)  
  {  
  if   ((d-num[middle2])>0)  
  {  
  break;  
  }  
  else  
  low=middle+1;  
  }  
  else  
  {  
  if   ((num[middle1]-d)>0)  
  {  
  key=false;  
  break;  
  }  
  else  
  high=middle-1;  
  }  
   
  }  
  if   (key)  
  {  
  System.out.println(num[middle2]);  
  System.out.println(num[middle]);  
  }  
  else  
  {  
  System.out.println(num[middle]);  
  System.out.println(num[middle1]);  
  }  
  }  
   
  public   static   void   main(String[]   args)   throws   IOException  
  {  
  BufferedReader   in   =   new   BufferedReader(new   InputStreamReader(System.in));  
   
  double[]   num=new   double[100];  
  for   (int   i=0;i<num.length;i++)  
  {  
  num[i]=Math.random()*1000;  
  }  
  num=sort(num);  
  for   (int   i=0;i<num.length;i++)  
  {  
  System.out.print(num[i]+"   ");  
  }  
  System.out.println();  
  for   (;;)  
  {  
  System.out.print("num>");  
  String   line=in.readLine();  
  if   ((line==null)||(line.equals("quit")))  
  break;  
  try  
  {  
  double   d=Double.parseDouble(line);  
  search(d,num);  
  }  
  catch   (Exception   e)  
  {  
  System.out.println("Invalid   Input");  
  }  
   
  }  
   
  }  
  }Top

19 楼zhouyong80(老怪)回复于 2005-03-03 19:24:46 得分 0

感谢各位大侠的指教,问题我已经解决了。。。  
  把我调试通过的源代码发在下面,希望大家指教。。。。  
  程序中还有很多不完善的地方,对于异常的处理也很粗略,不过我想对于和我一样的新手应该会有一定的启发。。。。。  
   
  import   java.io.*;  
   
  /**  
    *   对100个随机浮点数排序,然后交互的让用户输入一个数  
    *   打印出数组中离这个数最近的大数和小数  
    *   使用二分查找法。  
  **/  
   
  public   class   SortNumbers  
  {  
  public   static   double[]   sort(double[]   num)  
  {  
  //循环每一个元素,每次循环找到数组中未排序的元素  
  //中最小的一个,把它移动到最前面  
  for   (int   i=0;i<num.length;i++)  
  {  
  int   min=i; //保存最小元素的索引号  
  //查找i到数组最后一个元素中最小的元素  
  for   (int   j=i;j<num.length;j++)  
  {  
  if   (num[j]<num[min])  
  min=j;  
  }  
  //将i与最小元素交换  
  //这样就排序成功了  
  double   tmp;  
  tmp=num[i];  
  num[i]=num[min];  
  num[min]=tmp;  
   
  }  
  return   num;  
  }  
   
  public   static   void   search(double   d,double[]   num)  
  {  
  int   low=0;  
  int   high=num.length-1;  
  int   middle=0;  
  int   middle1=0;  
  int   middle2=0;  
  boolean   key=true;  
  while(low<=high)  
  {  
  if   (d<num[0])  
  {  
  System.out.println("输入的数是数组中最小的一个");  
  break;  
  }  
  if   (d>num[num.length-1])  
  {  
  System.out.println("输入的数是数组中最大的一个");  
  break;  
  }  
   
  middle=(low+high)/2;  
  middle1=middle+1;  
  middle2=middle-1;  
  if   (d<num[middle])  
  {  
  if   (d>num[middle2])  
  {  
  break;  
  }  
  else  
  high=middle-1;  
  }  
  else  
  {  
  if   (d<num[middle1])  
  {  
  key=false;  
  break;  
  }  
  else  
  low=middle+1;  
  }  
   
  }  
  if   (key)  
  {  
  System.out.println(num[middle2]);  
  System.out.println(num[middle]);  
  }  
  else  
  {  
  System.out.println(num[middle]);  
  System.out.println(num[middle1]);  
  }  
  }  
   
  public   static   void   main(String[]   args)   throws   IOException  
  {  
  BufferedReader   in   =   new   BufferedReader(new   InputStreamReader(System.in));  
   
  double[]   num=new   double[100];  
  for   (int   i=0;i<num.length;i++)  
  {  
  num[i]=Math.random()*1000;  
  }  
  num=sort(num);  
  for   (int   i=0;i<num.length;i++)  
  {  
  System.out.print(num[i]+"   ");  
  }  
  System.out.println();  
  for   (;;)  
  {  
  System.out.print("num>");  
  String   line=in.readLine();  
  if   ((line==null)||(line.equals("quit")))  
  break;  
  try  
  {  
  double   d=Double.parseDouble(line);  
  search(d,num);  
  }  
  catch   (Exception   e)  
  {  
  System.out.println("Invalid   Input");  
  }  
   
  }  
   
  }  
  }Top

20 楼yjh133(哈哈)回复于 2005-03-03 19:47:45 得分 0

import   java.io.*;  
   
     
   
  public   class   SortNumbers  
  {  
  public   static   double[]   sort(double[]   num)  
  {  
  //循环每一个元素,每次循环找到数组中未排序的元素  
  //中最小的一个,把它移动到最前面  
  for   (int   i=0;i<num.length;i++)  
  {  
  int   min=i; //保存最小元素的索引号  
  //查找i到数组最后一个元素中最小的元素  
  for   (int   j=i;j<num.length;j++)  
  {  
  if   (num[j]<num[min])  
  min=j;  
  }  
  //将i与最小元素交换  
  //这样就排序成功了  
  double   tmp;  
  tmp=num[i];  
  num[i]=num[min];  
  num[min]=tmp;  
   
  }  
  return   num;  
  }  
   
  public   static   void   search(double   d,double[]   num)  
  {  
            int   low=0;  
            int   middle=0;  
            int   middle1=0;  
            int   high=num.length-1;  
            double   key=d;  
            int   exitFlag   =   0;    
        if   (d<num[0])  
          {  
              System.out.println("输入的数是数组中最小的一个");  
     
          }  
        else   if   (d>num[num.length-1])  
          {  
                System.out.println("输入的数是数组中最大的一个");  
     
          }  
                        else  
                            {  
                while   (low<=high)  
  {  
  middle=(low+high)/2;  
  if   (exitFlag   ==   middle)  
                                                  {  
  break;  
  }  
  exitFlag   =   middle;  
  if   (key<=num[middle])  
  high=middle;  
  else  
  low=middle;  
   
  }  
   
                                      if(num[middle]<d)  
                                            {  
                                           
                                            System.out.println("The   data   is:"+num[middle]+"\n"+num[middle+1]);  
                                            }                      
                                      else   if(num[middle]>d)  
                                              {    
                                                        System.out.println("The   data   is:"+num[middle-1]+"\n"+num[middle]);  
                                                }                                    
                                        else                                                                                                                   /*d   和其中数相等*/  
                  {  
                                              System.out.println("The   data   you   input   equals   "+num[middle]);     /*再比较num[middle-1]和num[middle+1]*/  
  }  
                  }  
            }    
   
   
  public   static   void   main(String[]   args)   throws   IOException  
  {  
  BufferedReader   in   =   new   BufferedReader(new   InputStreamReader(System.in));  
   
  double[]   num=new   double[100];  
  for   (int   i=0;i<num.length;i++)  
  {  
  num[i]=Math.random()*1000;  
  }  
  num=sort(num);  
  for   (int   i=0;i<num.length;i++)  
  {  
  System.out.print(num[i]+"   ");  
  }  
  System.out.println();  
  for   (;;)  
  {  
  System.out.print("num>");  
  String   line=in.readLine();  
  if   ((line==null)||(line.equals("quit")))  
  break;  
  try  
  {  
  double   d=Double.parseDouble(line);  
  search(d,num);  
  }  
  catch   (Exception   e)  
  {  
  System.out.println("Invalid   Input");  
  }  
   
  }  
   
  }  
  }  
  帮你调试过Top

相关问题

  • 100分求解程序错误
  • 求解小程序...
  • 刚学.net,配置运行petshop程序报错求解,急!!!!!!
  • 程序编译出错。高分求解答!!急盼。。
  • 100分求解程序错误。telnet相关。内附源码。
  • 高分求解~!帮忙看下程序,哪出错了
  • 高分求解~!帮忙看下程序,哪出错了
  • 请问哪里有规划求解的vc源程序可以下载
  • VC打印程序求解?
  • 经典C程序求解

关键词

  • search
  • 用户
  • 数组
  • 浮点
  • 元素
  • num
  • middle
  • 查找
  • ceil
  • double

得分解答快速导航

  • 帖主:zhouyong80
  • liuchunjp
  • rower203
  • liuchunjp
  • bigc2000
  • yiyo2025
  • monkeyK
  • yjh133

相关链接

  • CSDN Java频道
  • Java类图书
  • Java类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo