You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 11:25:37