判断第二个数是否为第一个数下一个素数的代码错误排查求助
问题排查:判断下一个素数的代码错误
需求说明
输入两个数,判断第二个数是否恰好是第一个数的下一个素数,是则输出"YES",否则输出"NO"。
用户提供的错误代码
#include <iostream> #include <bits/stdc++.h> using namespace std; int nextPrime(int x){ int y =x; for(int i=2; i <=sqrt(y); i++){ if(y%i == 0){ y = y+2; nextPrime(y); return (y); } } return y; } int main() { int n,m, x(0); cin >> n >> m; x = n+2; if(n = 2 && m == 3){ cout << "YES\n"; exit(0); } nextPrime(x) == m ? cout << "YES\n" : cout << "NO\n"; return 0; }
问题现象
仅当下一个素数与第一个数的差值为2或4时才会返回正确结果,怀疑问题与return语句有关。
核心错误分析
递归调用未正确传递结果
在nextPrime函数中,当发现y不是素数时,调用nextPrime(y)但没有接收其返回值,直接返回当前的y。这导致递归的结果被丢弃,函数只会返回y+2后的值,而不是真正的下一个素数。比如处理y=25时,递归调用nextPrime(27)会得到29,但函数直接返回27,导致结果错误。main函数中的赋值错误
if(n = 2 && m == 3)使用了赋值运算符=而非相等判断==,这会强制将n设为2,然后判断m是否为3,逻辑完全错误。起始查找位置错误
main函数中直接将x设为n+2,跳过了n+1的情况。比如当n=4时,下一个素数是5(n+1),但代码从6开始查找,直接漏掉了正确结果。素数判断逻辑的冗余与漏洞
依赖递归实现素数查找不仅容易出错,还存在逻辑漏洞:比如当y是偶数时(除了2),没有直接跳过,增加了不必要的计算。
修复后的完整代码
#include <iostream> #include <cmath> using namespace std; // 判断一个数是否为素数 bool isPrime(int num) { if (num <= 1) return false; if (num == 2) return true; if (num % 2 == 0) return false; for (int i = 3; i <= sqrt(num); i += 2) { if (num % i == 0) return false; } return true; } // 找到大于x的下一个素数 int nextPrime(int x) { int candidate = x; while (true) { if (isPrime(candidate)) { return candidate; } candidate++; // 优化:跳过偶数(除了2) if (candidate != 2 && candidate % 2 == 0) { candidate++; } } } int main() { int n, m; cin >> n >> m; int next_p = nextPrime(n + 1); cout << (next_p == m ? "YES\n" : "NO\n"); return 0; }
修复说明
- 拆分素数判断与下一个素数查找逻辑,代码更清晰易维护;
- 改用循环替代递归,彻底避免递归返回值丢失的问题;
- 从
n+1开始查找下一个素数,覆盖所有可能的情况; - 优化素数判断逻辑,跳过偶数(除2外),提升运行效率;
- 修正main函数中的赋值错误,恢复正确的条件判断逻辑。
内容的提问来源于stack exchange,提问作者अंशुल
相关产品推荐
相关产品推荐

