程序“随机”选择一组8个数字,然后用户必须尽可能多地猜测这些数字。但即使我输入这个随机数组中的数字,binary_search函数也找不到“随机”数字数组中的确切数字。我似乎无法在我的binary_search函数中找到错误(至少我怀疑那就是问题所在)。我已经尝试过大数字大小的程序。有人可以帮我吗?
#define SIZE 3
#define min 1
#define max 36
int random();
bool binary_search(int value, int values[], int n);
int main(void)
{
int numbers[SIZE];
for(int i = 0; i < SIZE; i++)
numbers[i] = random();
int score = 0;
int n[SIZE];
int number_user;
for(int i = 0; i < SIZE; i++)
{
//Type in a number
do
{
printf("Search number no.%d:\n> ", i + 1);
n[i] = GetInt();
//Wrong input number
if(n[i] < min || n[i] > max)
{
printf("\nNumber should be between %d - %d!!!\n\n", min , max);
}
}
while(n[i] < min || n[i] > max);
//THE PROBLEMATIC STUFF - START
number_user = n[i];
if (binary_search(number_user, numbers, SIZE))
{
printf("FOUND!!!\n");
score += 1;
}
else
{
printf("NOT IN THE LIST\n");
}
//PROBLEMATIC STUFF - FINISH
}
//scoring
printf("\n\n*******SCORE*******\n");
//print your numbers
for(int i = 0; i < SIZE; i++)
{
printf(" %d", n[i]);
if(i != SIZE - 1)
printf(",");
if(i == SIZE - 1)
printf(".\n");
}
//print right numbers
printf("\nRight numbers are:");
for(int i = 0; i < SIZE; i++)
{
printf(" %d", numbers[i]);
if(i != SIZE - 1)
printf(",");
if(i == SIZE - 1)
printf(".\n");
}
int result = score / SIZE * 100;
printf("Your score is: %d / %d , %d %%\n", score, SIZE, result);
return 0;
}
//PROBLEM START
bool binary_search(int value, int values[], int n)
{
int beginning = 0;
int ending = n - 1;
int middle;
while (ending >= beginning)
{
middle = (beginning + ending) / 2;
for(int i = 0; i < SIZE; i++)
{
//look at middle of list if (binary_search(n, numbers, SIZE))
if(values[middle] == value)
//if number found, return true
return true;
//else if middle higher, search left
else if(values[middle] > value)
ending = middle - 1;
//else if middle lower, search right
else if(values[middle] < value)
beginning = middle + 1;
}
}
return false;
}
//PROBLEM FINISH
int random()
{
int r = rand() % ((max - min + 1) + min);
return r;
}
答案 0 :(得分:5)
二进制搜索是关于排序的数组/列表/等等......你的程序会感觉到randomal数字。
见https://en.wikipedia.org/wiki/Binary_search_algorithm(第二行)。
答案 1 :(得分:2)
在你的二元搜索功能中你有这个循环......
for(int i = 0; i < SIZE; i++)
{
...
}
在其中,您多次更改beginning
和ending
值而不更改middle
。这意味着beginning
和ending
会根据middle
的单个值进行多次调整,这反过来意味着它可以“取消”实际拥有该数字的数组的范围“重新寻找。
此外,正如 MeNa 在他/她的回答中指出的那样,二进制搜索用于搜索有序数据集。它对于随机顺序的数组来说是无用的。
答案 2 :(得分:1)
如果这不是作业,你可以尝试使用bsearch
。 (这是POSIX功能。)