我的二进制搜索只返回数字不能是,C

Posted

技术标签:

【中文标题】我的二进制搜索只返回数字不能是,C【英文标题】:My Binary search only returns that the number cant be, C 【发布时间】:2022-01-22 08:02:48 【问题描述】:

这里是初学者,我无法修复错误,因为我不知道该做什么或代码有什么问题。无论数字如何,每个输入都返回它显示“数字不是数组的一部分”。我正在使用 100 个随机数字,范围从 0 到 900 作为我的排序列表。如果有人可以帮助我,我将不胜感激。

void find(int * randomized, int size, int * menu) 
    if((*menu)>=2)

        printf("\nEnter the number you are searching for: ");

        char tal[SIZE];
        fgets(tal, LENGTH, stdin);
        strtok(tal, "\n");

        int choice=atoi(tal);
        int high=size-1;
        int mid;
        int low = 0;
        int remainder, split;

        while (low<=high)
            mid = (low+high)/2;
            if(randomized[mid]==choice)
                remainder=(mid+1) %10;
                split=(mid+1) /10;
                if(remainder == 0 && split == 10)
                    remainder=10;
                    split=10;
                
                else if( remainder == 1 && split == 0)
                    remainder=1;
                    split=1;
                
                else if(remainder == 0 && split >0 && split <10)
                    remainder=10;
                    split=10;
                
                else
                    split=(mid+1)%10;
                
                printf("\n The numer %d is a part of the array.\nColumn: %d\n Line: %d", choice, remainder, split);
                return;
                
            
            else if(randomized[mid] !=choice)
                printf("\nThe number %d is not part of the array.\n", choice);
                return;
            
            else if (randomized[mid] <choice)
                low=mid+1;
            
            else
                high = mid - 1;
            
        
        (*menu=4);
    

【问题讨论】:

请证明***.com/help/minimal-reproducible-example你可以尝试使用gdb调试step bu step 使用打印语句来显示 randomize[mid] 的值和选择它吐出“数字不是数组的一部分”的位置,以及在整个代码中正确遵循逻辑 即使对专家来说,仅仅盯着代码也是一项困难的调试技术。您需要一种方法来帮助您跟踪代码在运行时所做的事情,以了解发生了什么问题。旧的打印语句调试是一种简单、经过验证且真正的技术,在调试器的控制下运行程序是一种更强大的技术。 由于您只使用 0 - 900 范围内的 100 个随机数字作为要搜索的数字列表,如果您自己随机选择,您将在 9 次中选择一个无法找到的数字。 您是否确认列表已排序? 【参考方案1】:

代码有一个if,后跟三个else 测试。由于第一个测试是针对equality,第二个是针对inequality,所以最后两个else 代码块永远无法输入。

if(randomized[mid]==choice)
    // some code ...

else if(randomized[mid] !=choice)
    // some code ...

else if (randomized[mid] <choice)
    // some code ...

else
    // some code ...

代码变得难以理解,因为二进制搜索中塞进了太多的功能。它应该专注于一项工作,并给出一个对或错的结果,然后你就可以采取行动。

【讨论】:

好收获! 我猜你可能会提到一种解决方案是使用bsearch() 而不是实现自己的二进制搜索。

以上是关于我的二进制搜索只返回数字不能是,C的主要内容,如果未能解决你的问题,请参考以下文章

如何创建一个实现递归二进制搜索的循环来搜索数组中的n个数字? JAVA

二进制搜索 C++ STL

来自 c 的随机十六进制答案

C语言

Leetcode练习(Python):数学类:第67题:二进制求和:给你两个二进制字符串,返回它们的和(用二进制表示)。 输入为 非空 字符串且只包含数字 1 和 0。

Leetcode练习(Python):数学类:第67题:二进制求和:给你两个二进制字符串,返回它们的和(用二进制表示)。 输入为 非空 字符串且只包含数字 1 和 0。