#include<stdio.h>
int m;
int show(int a[],int p,int r)
{
while(p<r)
{
if(m==(p+r+2)/2)
{
printf("%d\n",a[(p+r)/2]);
goto o;
}
if((m<(p+r+2)/2))
r=(p+r)/2;
else
p=(p+r)/2;
}
if(m==p)
//此处p==0,p-1数组就越界了,所以你输入0也会出错
printf("%d\n",a[p-1]);
if(m==r)
//此处r==6
printf("%d\n",a[r-1]);
o:return 0;
}
int main()
{
int a[]={1,2,3,4,5,6,7};
printf("想要输出第几小的数:");
scanf("%d",&m);
if(m>7)
printf("-1");
else show(a,0,6);
return 0;
}
给你注释了点地方,你看下你的show函数,里面根本就没有考虑到m=7时候怎么处理啊,当然就会一直while了,
不光输入7有问题,你输入0试试,也有问题;代码编译通过,不代表程序就没有问题哦,你这个错误就是逻辑上的错误了,算法设计有问题吧。你说下你想实现的目的是啥,难道是
这句话:想要输出第几小的数?
如果只是这个目的,真没必要搞的这么麻烦啊你,你的数组a是赋初始值了的。后面也没有要更改其中的元素。所以想输出第几小的数很好弄啊:
#include<stdio.h>
int main()
{
int m=0;
int a[]={1,2,3,4,5,6,7};
printf("想要输出第几小的数:");
scanf("%d",&m);
if(m>7||m<0)
printf("-1");
else printf("%d",a[m-1]);
return 0;
}
[此贴子已经被作者于2016-4-13 13:14编辑过]