$ cat main.c
#include <stdio.h>
void guess(size_t value, size_t min, size_t max) {
size_t i = 0;
while(value) {
size_t current = (min + max) / 2;
//++current; // 最后会出现0的情况,这直接导致死循环,所以要加1
//直接加1还是不行,会出现value是1,current是2的情况,这也导致死循环
if(!current) ++current;
printf("第%lu次尝试, 目标是%lu, 当前要存储的数是%lu, ", i++, value, current);
if(current > value) {
printf("存储失败\n");
} else {
printf("存储成功\n");
value -= current;
}
max = current;
}
}
int main(void) {
size_t value;
scanf("%lu", &value);
guess(value, 0, 1001);
/*
for(size_t i = 0; i <= 1000; ++i) {
guess(i, 0, 1001);
printf("====================\n");
}
*/
return 0;
}
$ gcc-debug -o main main.c
$ ./main
37
第0次尝试, 目标是37, 当前要存储的数是500, 存储失败
第1次尝试, 目标是37, 当前要存储的数是250, 存储失败
第2次尝试, 目标是37, 当前要存储的数是125, 存储失败
第3次尝试, 目标是37, 当前要存储的数是62, 存储失败
第4次尝试, 目标是37, 当前要存储的数是31, 存储成功
第5次尝试, 目标是6, 当前要存储的数是15, 存储失败
第6次尝试, 目标是6, 当前要存储的数是7, 存储失败
第7次尝试, 目标是6, 当前要存储的数是3, 存储成功
第8次尝试, 目标是3, 当前要存储的数是1, 存储成功
第9次尝试, 目标是2, 当前要存储的数是1, 存储成功
第10次尝试, 目标是1, 当前要存储的数是1, 存储成功
$ ./main
859
第0次尝试, 目标是859, 当前要存储的数是500, 存储成功
第1次尝试, 目标是359, 当前要存储的数是250, 存储成功
第2次尝试, 目标是109, 当前要存储的数是125, 存储失败
第3次尝试, 目标是109, 当前要存储的数是62, 存储成功
第4次尝试, 目标是47, 当前要存储的数是31, 存储成功
第5次尝试, 目标是16, 当前要存储的数是15, 存储成功
第6次尝试, 目标是1, 当前要存储的数是7, 存储失败
第7次尝试, 目标是1, 当前要存储的数是3, 存储失败
第8次尝试, 目标是1, 当前要存储的数是1, 存储成功
$ ./main
430
第0次尝试, 目标是430, 当前要存储的数是500, 存储失败
第1次尝试, 目标是430, 当前要存储的数是250, 存储成功
第2次尝试, 目标是180, 当前要存储的数是125, 存储成功
第3次尝试, 目标是55, 当前要存储的数是62, 存储失败
第4次尝试, 目标是55, 当前要存储的数是31, 存储成功
第5次尝试, 目标是24, 当前要存储的数是15, 存储成功
第6次尝试, 目标是9, 当前要存储的数是7, 存储成功
第7次尝试, 目标是2, 当前要存储的数是3, 存储失败
第8次尝试, 目标是2, 当前要存储的数是1, 存储成功
第9次尝试, 目标是1, 当前要存储的数是1, 存储成功
$ ./main
789
第0次尝试, 目标是789, 当前要存储的数是500, 存储成功
第1次尝试, 目标是289, 当前要存储的数是250, 存储成功
第2次尝试, 目标是39, 当前要存储的数是125, 存储失败
第3次尝试, 目标是39, 当前要存储的数是62, 存储失败
第4次尝试, 目标是39, 当前要存储的数是31, 存储成功
第5次尝试, 目标是8, 当前要存储的数是15, 存储失败
第6次尝试, 目标是8, 当前要存储的数是7, 存储成功
第7次尝试, 目标是1, 当前要存储的数是3, 存储失败
第8次尝试, 目标是1, 当前要存储的数是1, 存储成功
$