我的二进制搜索只返回数字不能是,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
Leetcode练习(Python):数学类:第67题:二进制求和:给你两个二进制字符串,返回它们的和(用二进制表示)。 输入为 非空 字符串且只包含数字 1 和 0。
Leetcode练习(Python):数学类:第67题:二进制求和:给你两个二进制字符串,返回它们的和(用二进制表示)。 输入为 非空 字符串且只包含数字 1 和 0。