C++打印两数间质数代码错误排查:输出重复且包含非质数
问题分析与修正方案
原代码的核心错误
- 错误输出了检测质数的除数
n,而非目标数i,导致非质数的中间值被打印。 - 未判断目标数
i是否通过所有质数检测(即内层循环未触发break),直接输出内容,逻辑完全颠倒。 - 未处理
i < 2的情况,不符合质数(大于等于2的自然数)的定义。 - 存在无用的全局变量
n,与内层循环的局部变量冲突,属于冗余代码。
修正后的代码
#include <iostream> using namespace std; int main() { int a, b; cout << "enter the first no." << endl; cin >> a; cout << "Enter the second no." << endl; cin >> b; // 确保起始数不小于2(质数的最小值) if (a < 2) { a = 2; } for (int i = a; i <= b; i++) { bool isPrime = true; // 优化:仅需检测到i的平方根,减少计算量 for (int n = 2; n * n <= i; n++) { if (i % n == 0) { isPrime = false; break; } } // 只有通过所有检测的数才是质数,输出该数 if (isPrime) { cout << i << endl; } } return 0; }
修正说明
- 质数判断逻辑修正:新增
isPrime布尔标记,初始设为true,内层循环仅负责检测i是否存在因数,一旦找到因数就标记为非质数并跳出循环,循环结束后根据标记决定是否输出i。 - 边界处理:添加
a < 2的判断,将起始数修正为2,避免对1及负数的无效检测。 - 性能优化:内层循环终止条件改为
n * n <= i,利用数学原理减少循环次数,提升检测效率。 - 冗余代码清理:移除无用的全局变量
n,避免变量作用域冲突。
内容的提问来源于stack exchange,提问作者Durvesh Gangan
相关产品推荐
相关产品推荐

