请求修复theClosestPrimeNumber函数:邻近素数查找功能失效
问题分析与修复方案
首先,你的代码核心问题出在两个地方:isPrimeNumber函数的素数判断逻辑错误,以及theClosestPrimeNumber函数在寻找更小素数时的边界处理缺失,导致死循环或错误结果。
1. 修复isPrimeNumber函数
原函数错误地将0、1判定为素数,且遍历效率极低。素数的定义是大于1的自然数,除了1和自身外无其他因数,修正后的代码如下:
bool isPrimeNumber(int x) { // 小于等于1的数都不是素数 if (x <= 1) { return false; } // 2是唯一的偶素数 if (x == 2) { return true; } // 偶数直接排除(除了2) if (x % 2 == 0) { return false; } // 只需要检查到x的平方根,且只遍历奇数,大幅提升效率 for (int i = 3; i * i <= x; i += 2) { if (x % i == 0) { return false; } } return true; }
2. 修复theClosestPrimeNumber函数
原函数在寻找比x小的素数时,没有处理lower < 2的边界情况(比如x=1、0或负数),会导致死循环或返回错误的非素数。同时简化冗余变量,修正后的代码:
int theClosestPrimeNumber(int x) { // x本身是素数,直接返回 if (isPrimeNumber(x)) { return x; } // 寻找比x大的第一个素数 int higher = x + 1; while (!isPrimeNumber(higher)) { higher++; } // 寻找比x小的第一个素数,确保不小于最小素数2 int lower = x - 1; while (lower >= 2 && !isPrimeNumber(lower)) { lower--; } // 若没有更小的素数(比如x<=2),直接返回更大的素数 if (lower < 2) { return higher; } // 比较距离,返回更近的素数;距离相等时按原逻辑返回更大的素数 int distLower = x - lower; int distHigher = higher - x; if (distLower > distHigher) { return higher; } else if (distLower < distHigher) { return lower; } else { return higher; } }
关键修复点说明
- 修正素数判断逻辑,避免将0、1误判为素数
- 为寻找更小素数的循环添加
lower >= 2的边界条件,防止死循环 - 优化素数判断的遍历范围,从
x-1缩小到sqrt(x),并只遍历奇数,提升性能 - 简化冗余变量,让代码更易读
内容的提问来源于stack exchange,提问作者Tomasz Wiśniewski
相关产品推荐
相关产品推荐

