哪位达人帮忙看看这个程序错在哪里了!(50分求解)
代码如下,编译运行都没有问题,就是不出结果。。。
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




