友友萌,帮俺看看哪里不对啊

img

#include <stdio.h>

int main()
{
int a[15],i,j,n;
int high,mid,x,low=0;
x=sizeof(a)/sizeof(a[0]);
high=x-1;
for(i=0;i<=14;i++)
scanf("%d",&a[i]);
scanf("%d",&n);
while(low<high)
{
mid=(high+low)/2;
if(a[mid]==n)
{
i=mid;
break;
}
else if(a[mid]>n)
high=mid-1;
else
low=mid+1;
}
j=i+1;
if(n<a[0]&&n>a[14])
printf("cannot find %d",n);
else
printf("Has found %d, its position is %d",n,j);
return 0;
}

最后一个判断有问题,万一数组是1 3 5 7....,n是2,查找不到,但是n大于a[0],小于a[15]

你没考虑n不在15个数之内的情况


#include <stdio.h>

int main()
{
    int a[15],i,j,n;
    int high,mid,x,low=0;
    x=sizeof(a)/sizeof(a[0]);
    high=x-1;
    for(i=0;i<=14;i++)
        scanf("%d",&a[i]);
    scanf("%d",&n);
    while(low<high)
    {
        mid=(high+low)/2;
        if(a[mid]==n)
        {
            i=mid;
            break;
        }
        else if(a[mid]>n)
            high=mid-1;
        else
            low=mid+1;
    }
    if(low == high&&a[low] != n)
    {
        printf("cannot find %d",n);
        return 0;
    }
    j=i+1;
    if(n<a[0]&&n>a[14])
        printf("cannot find %d",n);
    else
        printf("Has found %d, its position is %d",n,j);
    return 0;
}

#include<stdio.h>
int main()
{
    int array[15] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14};
    int left = 0;
    int right = sizeof(array) / sizeof(array[0]);
    int key = 0;

    printf("请输入要查找的数字: ");
    scanf("%d", &key);

    // 二分查找
    while (left < right)
    {
        // 找到中间位置
        int mid = left + ((right - left) >> 1);
        if (key == array[mid])
        {
            printf("%d\n", mid);
            break;
        }
        else if (key < array[mid])
        {
            right = mid;
        }
        else
        {
            left = mid + 1;
        }
    }

    if (left >= right)
        printf("无此数\n");
    return 0;
}

你好,这段代码的错误是由于你最后的判断要找的数在不在数组里面的那部分代码有错误

if(n<a[0]&&n>a[14])
printf("cannot find %d",n);
else
printf("Has found %d, its position is %d",n,j);

比如输入的数据是1 2 4 5 6 7 8 9 10 11 12 13 14 15 16,然后要查找3的话,因为3是小于最后一个元素而且大于第一个元素的,所以就会被判断成数组中有这个数,导致错误。
一般我们可以利用一个变量来表示一下是否成功找到了该元素,这里我们定义一个flag变量,当我们找到时,flag就为1,没找到flag就为0

#include <stdio.h>

int main()
{
int a[15],i,j,n;
int high,mid,x,low=0;
int flag=0;
x=sizeof(a)/sizeof(a[0]);
high=x-1;
for(i=0;i<=14;i++)
scanf("%d",&a[i]);
scanf("%d",&n);
while(low<high)
{
mid=(high+low)/2;
if(a[mid]==n)
{
i=mid;
flag=1;//这里改了
break;
}
else if(a[mid]>n)
high=mid-1;
else
low=mid+1;
}
j=i+1;
if(flag)
printf("Has found %d, its position is %d",n,j);
else  printf("cannot find %d",n);
return 0;
}

这样就可以了。

自己对照


#include <stdio.h>
int main() 
{
    int a[15],i,j,n;
    int high,mid,x,low=0;
    x=sizeof(a)/sizeof(a[0]);
    high=x-1;
    printf("请按从小到大的顺序输入15个整数:");
    for (i=0;i<=14;i++)
        scanf("%d",&a[i]);
    printf("\n请输入搜索的关键字:");
    scanf("%d",&n);
    i=-1;
    while(low<=high) 
    {
        mid=low+ ((high- low) / 2);
        if (a[mid]> n) 
        {
            high= mid- 1;
        } else if (a[mid]< n) 
        {
            low = mid+ 1;
        } else 
        {
            i=mid;
            break;
        }
    }
    if(i >= 0) 
    {
        printf("\nHas found %d, its position is %d",n,i);
    } else 
    {
        printf("\ncannot find %d",n);
    }
    return 0;
}

考虑的范围不全,所以结果不对