Go语言二分查找素数索引:如何处理列表值间输入?
修复二分查找素数索引的Go程序问题
你的代码核心问题在于没有正确维护二分查找的边界范围,仅靠单一变量i调整位置,导致区间收缩逻辑混乱,最终陷入死循环。下面是修正后的实现,同时解决了非素数输入的处理问题:
package main import "fmt" func findPrime() int { primes := []int{2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97} var num int fmt.Println("Choose a prime number less than 100:") fmt.Scanln(&num) low := 0 high := len(primes) - 1 for low <= high { mid := (low + high) / 2 switch { case primes[mid] == num: return mid case primes[mid] > num: high = mid - 1 default: low = mid + 1 } } // 区间耗尽仍未找到,说明输入非目标范围内的素数 fmt.Println("Number is not a prime number less than 100, try again.") return findPrime() } func main() { index := findPrime() fmt.Printf("Prime number found at index: %d\n", index) }
关键改进说明
- 引入
low和high变量明确当前查找区间的上下边界,初始覆盖整个素数列表 - 每次计算
mid作为区间中间位置,直接与目标值对比,逻辑清晰无歧义 - 根据对比结果精准收缩区间:若目标值小于
primes[mid],则调整high缩小右边界;反之调整low缩小左边界 - 当
low > high时,说明整个列表已遍历完毕,目标值不存在,直接触发重新输入流程 - 移除原代码中易导致数组越界的
primes[i-1]判断,同时避免了无意义的递归前置判断
原代码陷入循环的原因是:区间调整逻辑错误,无法正确收敛到“无可行区间”的状态,导致变量i在几个值之间来回跳动,无法终止循环。而通过明确维护边界的方式,能确保每次迭代都有效缩小查找范围,最终要么找到目标,要么明确判定不存在。
内容的提问来源于stack exchange,提问作者Corndog333
相关产品推荐
相关产品推荐

